如何在Oracle SQL Developer中找到哪些表引用了给定的表?


199

Oracle SQL Developer中,如果我正在查看表上的信息,则可以查看约束,这些约束可以让我看到外键(以及该表引用了哪些表),还可以查看依赖项以了解哪些内容。包等参考表。但是我不确定如何找到哪些表引用了该表。

例如,说我在看emp桌子。还有另一个表emp_dept可以捕获哪个员工在哪个部门工作,该emp表通过表emp_id的主键引用该emp表。有没有办法(通过程序中的某些UI元素,而不是通过SQL)找到该emp_dept表引用了该emp表,而无需我知道该emp_dept表是否存在?

Answers:


258

否。OracleSQL Developer没有可用的此类选项。

您必须手动执行查询或使用其他工具(例如PLSQL Developer具有此类选项)。以下SQL是PLSQL Developer使用的SQL:

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,它表示“ 过程,程序包,函数,程序包主体和触发器之间的依赖关系,包括当前用户可以访问的触发器”在没有任何数据库链接的情况下创建的视图。” 。然后,此报告对您的问题毫无价值。


30
感谢你的回答。对于Oracle Sql Developer的可耻性感到羞耻。
格雷格

1
您提到PLSQL Developer能够执行此功能,您能解释一下吗?
尼古拉斯

4
@Nicholas,在对象浏览器中,选择一个表,右键单击一个表并选择“外键引用”
FerranB 2011年

3
此答案表明,SQL Developer 4.1及更高版本现在具有“模型”选项卡选项,该选项卡将以ERD格式显示此信息。
SnoringFrog

1
r_owner是您正在使用的架构,r_table_name是您要查找引用的表
Flowy

108

要将其作为扩展添加到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:

    • 工具>首选项
    • 数据库>用户定义的扩展
    • 点击“添加行”按钮
    • 在“类型”中选择“ EDITOR”,在“位置”中保存上面的xml文件
    • 单击“确定”,然后重新启动SQL Developer
  2. 导航到任何表,现在您应该在SQL旁边看到一个附加标签,标签为FK References,其中显示了新的FK信息。

  3. 参考


您知道Packages的节点名称是什么吗?我在网上找到的所有xsd链接都不再有效(如在Oracle中删除了它们)。
James Sumners 2012年

1
我给您的建议添加了一个小变化: and order by之前的owner = user,这样,如果您在两个模式中具有相同表的两个实例,则只会得到与您的模式相关的引用
user1708042 2013年

我添加了以下条件:and owner = :OBJECT_OWNER之前and exists
M Denis

3
@ M-Denis,在这种情况下,您可能会错过其他架构的引用。
Youw

应用并运行describe books;and之后select * from books;,它不会在Oracle sql developer VM上显示fk引用选项卡。
mLstudent33

36

在以下查询中将[Your TABLE]替换为emp

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]');

我认为这constraint_type in ('P','U') 是多余的,因为如果约束TOTO的constraint_type为“ R”,则TOTO的r_constraint_name当然是引用表中类型为“ P”或“ U”的约束的名称。无需指定它。您正在使用IN,所以就像许多,OR我们只关心OR的唯一操作数,其结果为true。
加布是好人2016年

10

您可以从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"
    );

1
外键不仅可以引用主键,还可以引用唯一键,并且表名可以在多个模式中使用,这将导致多个匹配项。如果要使用“ All_Constraints”而不是“ User_Constraints”,则也需要使用“所有者”列。
Mark Roddy

感谢您评论“ R”,“ U”和“ P”是什么
Jeff

不要忘记SQL请求末尾的分号。
加布是好人2016年

顺便说一下,('P','U')中的constraint_type是多余的,因为如果约束TOTO的constraint_type为'R',那么TOTO的r_constraint_name当然就是类型为'P'或'U的约束的名称在参考表中。无需指定它。
加布是好人2016年

9

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


1
如果出于某种原因需要在脚本中使用它,则没那么有用,但是如果您只需要了解连接,这似乎是现代的方法。
SnoringFrog

1
@SnoringFrog从技术上讲很好,这个问题要求提供UI元素,所以这是最合适的答案
WhatsThePoint 18/09/19

4

这样的事情怎么样:

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';

2
这为我工作,当我从改变表名dba_constraintsall_constraints像这样:SELECT c.constraint_name, c.constraint_type, c2.constraint_name, c2.constraint_type, c2.table_name FROM all_constraints c JOIN all_constraints c2 ON (c.r_constraint_name = c2.constraint_name) WHERE c.table_name = '<TABLE_OF_INTEREST>' AND c.constraint_TYPE = 'R';
chrisjleu

4
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; 

这非常有用-递归显示某个根表中的所有表,这些表将在此根表中选择的列的值作为键来保存。太好了,谢谢。
Ev0oD

真的很酷-做得好。我只添加lower()比较table_name和column_name。
Tobias Otto

4

这已经存在于产品中多年了-尽管在2011年没有出现在产品中。

但是,只需单击“模型”页面。

确保您至少使用版本4.0(2013年发布)才能访问此功能。

在此处输入图片说明


0

要添加到上述针对sql developer插件的答案中,使用以下xml将有助于获取与外键关联的列。

    <items>
        <item type="editor" node="TableNode" vertical="true">
        <title><![CDATA[FK References]]></title>
        <query>
            <sql>
                <![CDATA[select a.owner,
                                a.constraint_name,
                                a.table_name,
                                b.column_name,
                                a.status
                         from   all_constraints a
                         join   all_cons_columns b ON b.constraint_name = a.constraint_name
                         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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.