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

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (40)

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

我拥有Oracle提供的SQL Developer工具和AllRoundAutomations提供的PL / SQL Developer。

提问于
用户回答回答于

我总是看起始表的外键,然后回去工作。数据库工具通常具有依赖关系或约束节点

只需将表格名称替换为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
用户回答回答于

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

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

通过这个解决方案,你还可以获得哪个表的哪一列正在引用目标表的哪一列(并且可以过滤它)。

扫码关注云+社区