我该如何在Oracle SQL Developer中查找引用特定表的表?

230
Oracle SQL Developer 中,若我正在查看一张表的信息,则可以查看其约束条件,这样便可查看到外键(从而知道哪些表被该表引用),并且可以查看依赖关系以了解哪些包或其他内容引用该表。但我不确定如何查找哪些表引用了这个表。
例如,假设我正在查看 emp 表,有另一张名为emp_dept 的表记录员工在哪个部门工作,并通过 emp_id 引用了 emp 表的主键。是否可以通过程序中的某个UI元素(而非SQL)找到它引用了 emp 表,而无需我知道 emp_dept 表的存在?

为了澄清这里所询问的引用方向:这个问题是从 emp 表的角度来询问指向 emp 的内部引用(即来自其他表的引用)。如果您想要另一个方向(即 TableName 从自身向其他表进行的外部引用),我认为这个问题已经在这个其他问题中得到了回答。 - cellepo
这里是一个实际的仅限UI答案(OP在此问题中实际请求)。另外,这里是[到目前为止] 最简单的SQL答案 - cellepo
12个回答

0

针对 SQL 开发人员插件的上述答案,使用以下 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>

0

我喜欢使用直接的SQL查询来完成这个任务,而不是在SQL开发工具中瞎搞。

以下是我刚刚完成它的方法。最好先仔细阅读并理解其中的过程,以便您可以根据自己的需求进行调整...

WITH all_primary_keys AS (
  SELECT constraint_name AS pk_name,
         table_name
    FROM all_constraints
   WHERE owner = USER
     AND constraint_type = 'P'
)
  SELECT ac.table_name || ' table has a foreign key called ' || upper(ac.constraint_name)
         || ' which references the primary key ' || upper(ac.r_constraint_name) || ' on table ' || apk.table_name AS foreign_keys
    FROM all_constraints ac
         LEFT JOIN all_primary_keys apk
                ON ac.r_constraint_name = apk.pk_name
   WHERE ac.owner = USER
     AND ac.constraint_type = 'R'
     AND ac.table_name = nvl(upper(:table_name), ac.table_name)
ORDER BY ac.table_name, ac.constraint_name
;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接