查找哪个 oracle 数据库对象将数据插入特定 table?

Find which oracle database object inserts data into a particular table?

我想找到将数据插入特定 table 的存储过程、程序包、函数或触发器的名称,是否有任何内置对象以便我可以使用它。我正在搜索过去 2 小时内对象的名称。请帮忙。

您可以尝试使用如下方式分析您的数据库的所有源代码:

select *
from dba_source
where upper(text) like '%TABLE_NAME%'

这种方法的优点是您将获得均匀的动态代码;缺点是您甚至会 select、更新...

如果 table 是静态引用的,您可以检查 ALL_DEPENDENCIES 视图

SELECT * FROM ALL_DEPENDENCIES WHERE REFERENCED_NAME = '<your table>';

这将找到所有用法,而不仅仅是插入

您也可以在源代码中搜索:

SELECT * FROM ALL_SOURCE WHERE UPPER(TEXT) LIKE '%INSERT%<your table>%'

仅当 INSERT 和您的 table 在同一行时,才会找到用法。

但是,如果命令是动态构建的,那么您将不会发现它那么简单。

您找不到插入的 PL/SQL 块,但您可以尝试识别引用它的 procedures/functions。并增加找到的机会。

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;

上述查询将 return table 个对象,引用此 table。

请注意,当您仅使用 STATIC 查询时,这会 return。任何动态查询,都是完全不可控的。

您可以使用 user_source 或 user_dependencies table,如下所示。

  1. 使用tableuser_source

    select  * from user_source
    where upper(text) like '%<YOUR TABLE NAME in UPPER CASE>%'
    

    您可以 select 从 user_source , all_source , dba_source 取决于您登录的用户和该用户拥有的权限。

  2. 使用tableuser_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>'
    

    您可以 select 从 user_dependencies , all_dependencies , dba_dependencies 取决于您登录的用户和该用户拥有的权限。