我如何才能find哪些表引用Oracle SQL Developer中的给定表?

在Oracle SQL Developer中 ,如果我查看表中的信息,我可以查看约束,这可以让我看到外键(以及由此表引用哪些表),并且可以查看依赖关系以查看包和这样的参考表。 但我不知道如何find哪些表引用表。

例如,我正在查看emp表。 还有另外一个表emp_dept ,用于捕获哪些员工在哪个部门工作,哪些部门通过emp_idemp表的主键)引用emp表。 有没有办法(通过程序中的一些UI元素,而不是通过SQL)发现emp_dept表引用emp表,而我不必知道emp_dept表存在?

不,Oracle SQL Developer没有这样的选项。

你必须手工执行查询或使用其他工具(例如PLSQL Developer有这样的选项)。 下面的SQL是由PLSQL Developer使用的:

 select table_name, constraint_name, status, owner from all_constraints where r_owner = :r_owner and constraint_type = 'R' and r_constraint_name in ( select constraint_name from all_constraints where constraint_type in ('P', 'U') and table_name = :r_table_name and owner = :r_owner ) order by table_name, constraint_name 

其中r_owner是模式, r_table_name是要查找引用的表。 名称区分大小写


要小心,因为在Oracle SQL Developer的报告选项卡上有ALL_DEPENDENCIES选项“All tables / Dependencies”,它指的是“ 当前用户可以访问的过程,包,函数,包体和触发器之间的依赖关系,包括依赖关系没有任何数据库链接创build的视图。“ 。 那么,这个报告对你的问题没有任何价值。

要将其作为扩展添加到SQL Developer,请执行以下操作:

  1. 将下面的代码保存到一个xml文件(例如fk_ref.xml)中:
 <items> <item type="editor" node="TableNode" vertical="true"> <title><![CDATA[FK References]]></title> <query> <sql> <![CDATA[select a.owner, a.table_name, a.constraint_name, a.status from all_constraints a where a.constraint_type = 'R' and exists( select 1 from all_constraints where constraint_name=a.r_constraint_name and constraint_type in ('P', 'U') and table_name = :OBJECT_NAME and owner = :OBJECT_OWNER) order by table_name, constraint_name]]> </sql> </query> </item> </items> 
  1. 将扩展添加到SQL Developer:

    • 工具>首选项
    • 数据库>用户定义的扩展
    • 点击“添加行”button
    • 在typesselect“编辑器”,位置是你保存上面的XML文件
    • 点击“确定”,然后重新启动SQL Developer
  2. 导航到任何表格,现在你应该在SQL之后看到一个附加的选项卡,标记为FK References,它显示新的FK信息。

  3. 参考

在下面的查询中用[ emp ]replace[Your TABLE]

 select owner,constraint_name,constraint_type,table_name,r_owner,r_constraint_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='[YOUR TABLE]'); 

2015年5月发布的SQL Developer 4.1添加了一个“模型”选项卡,该选项卡显示以实体关系图格式引用您的表的表外键。

您可能能够从ALL_CONSTRAINTS视图中查询:

 SELECT table_name FROM ALL_CONSTRAINTS WHERE constraint_type = 'R' -- "Referential integrity" AND r_constraint_name IN ( SELECT constraint_name FROM ALL_CONSTRAINTS WHERE table_name = 'EMP' AND constraint_type IN ('U', 'P') -- "Unique" or "Primary key" ); 

怎么样这样的事情:

 SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM dba_constraints c JOIN dba_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = <TABLE_OF_INTEREST> AND c.constraint_TYPE = 'R'; 
 SELECT DISTINCT table_name, constraint_name, column_name, r_table_name, position, constraint_type FROM (SELECT uc.table_name, uc.constraint_name, cols.column_name, (SELECT table_name FROM user_constraints WHERE constraint_name = uc.r_constraint_name) r_table_name, (SELECT column_name FROM user_cons_columns WHERE constraint_name = uc.r_constraint_name AND position = cols.position) r_column_name, cols.position, uc.constraint_type FROM user_constraints uc inner join user_cons_columns cols ON uc.constraint_name = cols.constraint_name WHERE constraint_type != 'C') START WITH table_name = '&&tableName' AND column_name = '&&columnName' CONNECT BY NOCYCLE PRIOR table_name = r_table_name AND PRIOR column_name = r_column_name;