如何查找指向Oracle中一条记录的外键依赖项?

dav*_*lab 21 database oracle database-schema

我有一个非常大的Oracle数据库,有许多表和数百万行.我需要删除其中一个,但是要确保删除它不会破坏任何指向它作为外键记录的其他依赖行.有没有办法获得指向此行的所有其他记录或至少表格模式的列表?我知道我可以尝试自己删除它,并捕获异常,但我不会自己运行脚本,需要它第一次运行清理.

我有来自Oracle的SQL Developer工具和来自AllRoundAutomations的PL/SQL Developer.

提前致谢!

zig*_*arn 33

这是我列出对表的所有引用的解决方案:

select
  src_cc.owner as src_owner,
  src_cc.table_name as src_table,
  src_cc.column_name as src_column,
  dest_cc.owner as dest_owner,
  dest_cc.table_name as dest_table,
  dest_cc.column_name as dest_column,
  c.constraint_name
from
  all_constraints c
inner join all_cons_columns dest_cc on
  c.r_constraint_name = dest_cc.constraint_name
  and c.r_owner = dest_cc.owner
inner join all_cons_columns src_cc on
  c.constraint_name = src_cc.constraint_name
  and c.owner = src_cc.owner
where
  c.constraint_type = 'R'
  and dest_cc.owner = 'MY_TARGET_SCHEMA'
  and dest_cc.table_name = 'MY_TARGET_TABLE'
  --and dest_cc.column_name = 'MY_OPTIONNAL_TARGET_COLUMN'
;
Run Code Online (Sandbox Code Playgroud)

使用此解决方案,您还可以获得哪个表的哪一列引用目标表的哪一列(并且可以对其进行过滤)的信息.


Eri*_*der 26

我总是看着起始桌的外键,然后回去工作.数据库工具通常具有依赖项或约束节点.我知道PL/SQL Developer有办法看到FK,但是我用了它已经有一段时间了,所以我无法解释它......

只需用表名替换XXXXXXXXXXXX ......

/* The following query lists all relationships */ 

select
 a.owner||'.'||a.table_name "Referenced Table"
,b.owner||'.'||b.table_name "Referenced by"
,b.constraint_name "Foreign Key"
from all_constraints a, all_constraints b 
where 
b.constraint_type = 'R'
and a.constraint_name = b.r_constraint_name 
and b.table_name='XXXXXXXXXXXX' -- Table name 
order by a.owner||'.'||a.table_name
Run Code Online (Sandbox Code Playgroud)

  • Sql区分大小写 (2认同)
  • 同意.我觉得这个查询显示了b.table_name所依赖的所有表.并非所有依赖于b.table_name的表 (2认同)

Don*_*gyi 10

我最近遇到了类似的问题,但很快就遇到了,找到直接的依赖关系是不够的.所以我写了一个查询来显示多级外键依赖关系的树:

SELECT LPAD(' ',4*(LEVEL-1)) || table1 || ' <-- ' || table2 tables, table2_fkey
FROM
  (SELECT a.table_name table1, b.table_name table2, b.constraint_name table2_fkey
  FROM user_constraints a, user_constraints b 
  WHERE a.constraint_type IN('P', 'U') 
  AND b.constraint_type = 'R' 
  AND a.constraint_name = b.r_constraint_name 
  AND a.table_name != b.table_name
  AND b.table_name <> 'MYTABLE')
CONNECT BY PRIOR  table2 = table1 AND LEVEL <= 5
START WITH table1 = 'MYTABLE';
Run Code Online (Sandbox Code Playgroud)

在我的数据库中使用SHIPMENT作为MYTABLE时,它给出了这样的结果:

SHIPMENT <-- ADDRESS
SHIPMENT <-- PACKING_LIST
    PACKING_LIST <-- PACKING_LIST_DETAILS
    PACKING_LIST <-- PACKING_UNIT
        PACKING_UNIT <-- PACKING_LIST_ITEM
    PACKING_LIST <-- PO_PACKING_LIST
...
Run Code Online (Sandbox Code Playgroud)