【发布时间】:2016-04-15 17:40:18
【问题描述】:
我想查找将数据插入特定表的存储过程、包、函数或触发器的名称,是否有任何内置对象以便我可以使用它。我正在搜索过去 2 小时内的对象名称。请帮忙。
【问题讨论】:
标签: oracle stored-procedures oracle11g toad
我想查找将数据插入特定表的存储过程、包、函数或触发器的名称,是否有任何内置对象以便我可以使用它。我正在搜索过去 2 小时内的对象名称。请帮忙。
【问题讨论】:
标签: oracle stored-procedures oracle11g toad
您可以尝试通过以下方式分析数据库的所有来源:
select *
from dba_source
where upper(text) like '%TABLE_NAME%'
这种方法的优点是您可以获得动态代码;缺点是你甚至可以选择、更新……
【讨论】:
如果表是静态引用的,您可以查看ALL_DEPENDENCIES 视图
SELECT * FROM ALL_DEPENDENCIES WHERE REFERENCED_NAME = '<your table>';
这将找到所有用法,而不仅仅是插入
您也可以在源代码中搜索:
SELECT * FROM ALL_SOURCE WHERE UPPER(TEXT) LIKE '%INSERT%<your table>%'
仅当INSERT 和您的表在同一行时,才会找到用法。
但是,如果命令构建得更加动态,那么您将不会发现它那么简单。
【讨论】:
您无法找到插入的 PL/SQL 块,但您可以尝试识别引用它的过程/函数。并增加您找到的机会。
select
proc_syn.nam,
proc_syn.referenced_owner,
proc_syn.referenced_name,
proc_syn.referenced_type,
syn_tab.table_name
from
dba_dependencies proc_syn, dba_synonyms syn_tab, dba_tables tables
where
REFERENCED_TYPE in ( 'SYNONYM','TABLE')
AND proc_syn.referenced_name = syn_tab.synonym_name
AND syn_tab.synonym_name = tables.table_name
AND syn_tab.owner = 'PUBLIC'
AND REFERENCED_NAME = 'YOUR_TABLE_NAME'
order by
proc_syn.referenced_owner, syn_tab.table_name;
上述查询将返回引用此表的表对象。
注意,当您仅使用 STATIC 查询时,这将返回。任何动态查询,都完全失控。
【讨论】:
您可以使用 user_source 或 user_dependencies 表,如下所示。
使用表user_source
select * from user_source
where upper(text) like '%<YOUR TABLE NAME in UPPER CASE>%'
您可以根据您登录的用户和该用户的权限从 user_source 、 all_source 、 dba_source 中进行选择。
使用表user_dependencies
SELECT NAME FROM user_dependencies WHERE referenced_name = '<YOUR TABLE NAME in UPPER CASE>'
UNION
SELECT referenced_name FROM user_dependencies WHERE name = '<YOUR TABLE NAME in UPPER CASE>'
您可以根据您登录的用户和该用户拥有的权限从 user_dependencies 、 all_dependencies 、 dba_dependencies 中进行选择。
【讨论】: