【发布时间】:2014-02-20 21:45:20
【问题描述】:
我正在对一些使用 Oracle 数据库 (11g) 的旧代码进行一些分析工作。我有一个代码表,想找到调用/使用该表的所有表、触发器等(如外键引用)。我目前使用 Oracle SQL Developer,但不确定是否可以编写查询来找到它。有没有办法可以在同一架构中找到对当前表的所有引用?在此先感谢...
【问题讨论】:
我正在对一些使用 Oracle 数据库 (11g) 的旧代码进行一些分析工作。我有一个代码表,想找到调用/使用该表的所有表、触发器等(如外键引用)。我目前使用 Oracle SQL Developer,但不确定是否可以编写查询来找到它。有没有办法可以在同一架构中找到对当前表的所有引用?在此先感谢...
【问题讨论】:
您可以使用数据字典来执行此操作,但使用哪个数据字典取决于相关对象的类型。因为您要查找几种不同类型的对象,所以需要使用多个字典,而且,如果您希望在一个查询中得到全部结果,则必须通过联合将几个查询连接在一起。
以下查询(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'
对于其他类型的对象,使用与下一个适当的字典相同的方法,并通过联合连接。你会发现这很有帮助:
http://www.oracle.com/pls/tahiti/tahiti.catalog_views
请注意,我在上面的查询中使用了 all_ 字典。每个都有一个等效的 dba_ 和 user_ 字典。 all_ 充当当前登录用户(您)有权访问的所有对象的字典。 dba_ 一个充当数据库中所有对象的字典,但是您需要具有使用 dba_ 字典的权限,所以我在上面的查询中没有使用它们(如果您有访问权限,请将 all_ 替换为 dba_) . user_ 字典充当当前用户/模式拥有的所有对象的字典。
【讨论】:
除了表和触发器之外,您可能还想检查是否有任何代码对象引用了您的表。 IE。程序,包。
所以你可以添加第三个查询:
从所有依赖项中选择 NAME,TYPE,其中 REFERENCED_OWNER='&your_table_owner' 和 REFERENCED_NAME='&your_table_name';
【讨论】: