查找使用当前表的所有其他表(oracle数据库)

时间:2014-02-20 21:45:20

标签: sql database oracle11g

我正在使用一些使用Oracle数据库(11g)的旧代码进行一些分析工作。我有一个代码表,并希望找到调用/使用此表的所有表,触发器等(如外键引用)。我目前使用Oracle SQL Developer,不确定是否可以编写查询来查找它。有没有办法在同一个Schema中找到对当前表的所有引用?提前谢谢......

2 个答案:

答案 0 :(得分:0)

您可以使用数据字典来执行此操作,但使用哪个数据字典取决于相关对象的类型。因为您想要找到几种不同类型的对象,所以您需要使用多个词典,如果您希望将结果全部放在一个查询中,则必须通过联合将几个查询连接在一起。

以下查询(通过联合连接到一个查询的2个查询)将显示带有在模式xyz中引用表xyz的键的表,以及在模式xyz中使用表xyz的触发器的名称(用您的任何内容替换表和模式名称)正在寻找:

select 'Table has key referencing this table' as match_type, table_name
  from all_constraints
 where constraint_type = 'R'
   and r_constraint_name in
       (select constraint_name
          from all_constraints
         where constraint_type in ('P', 'U')
           and table_name = 'TABLE_XYZ'
           and owner = 'SCHEMA_XYZ')
union all
select distinct 'Table is used by this trigger', trigger_name
  from all_triggers
 where table_name = 'TABLE_XYZ'
   and owner = 'SCHEMA_XYZ'

对于其他类型的对象,请使用与下一个相应字典相同的方法,并通过union连接。你会发现这有用:

http://www.oracle.com/pls/tahiti/tahiti.catalog_views

请注意,我在上面的查询中使用了all_ dictionaries。每个都有一个等效的dba_和user_字典。 all_1充当当前登录用户(您)可以访问的所有对象的字典。 dba_ one充当数据库中所有对象的字典,但是你需要有权使用dba_字典,所以我没有在上面的查询中使用它们(如果你有访问权限,用dba_替换all_) 。 user_ dictionaries充当当前用户/架构拥有的所有对象的字典。

答案 1 :(得分:0)

在表和触发器之上,您可能还想检查是否有引用表的代码对象。即。程序,包。

所以你可以添加第三个查询:

从all_dependencies中选择NAME,TYPE,其中REFERENCED_OWNER ='& your_table_owner'和REFERENCED_NAME ='& your_table_name';