我可以暂时禁用Oracle中的级联删除吗?

时间:2012-01-04 21:10:00

标签: oracle oracle11g

我经常需要从数据库中删除用户。用户存储在名为TPM_USER的表中。问题是,有一堆表在TPM_USER.USERID上有一个外键约束。更糟糕的是,这些约束正在使用ON CASCADE DELETE。前几天,我删除了一个我认为没有被任何东西使用过的用户(这是几个小时之前错误创建的重复用户),但它在没有任何警告的情况下消除了一堆重要数据。

就个人而言,我讨厌级联删除。我认为它们是危险的,只有在两个实体确实是相互依赖的情况下才应该使用它们。我希望将它们全部删除,但这种模式相当复杂,此时可能会有太大的变化。

我的问题:在DELETE上运行TPM_USER语句之前,我是否可以让甲骨文告诉我结果将被删除的内容?或者,如果违反任何外键,我可以暂时禁用任何级联并获取错误吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

在回答你的问题时,我不知道有什么简单的方法可以显示在级联删除语句中删除的内容。您可以编写脚本但它会非常复杂,因为您必须动态地遍历依赖关系树,只显示与删除条件相关的记录。

无论如何,您可以使用以下方法禁用约束:

alter table TABLE_NAME disable constraint FK_CONSTRAINT_NAME;

(使用'enable'重新启用它。)

显然你应该知道,如果你这样做,而另一个用户从同一个表中删除,那么Oracle就不会强制执行该约束,并且可能会发生不好的事情。

您可以获取引用TPM_USER.USERID的所有表/约束名称列表:

select table_name, constraint_name from user_constraints 
  where r_constraint_name in (
    select constraint_name 
    from user_constraints
    where constraint_type = 'P'
    and table_name = 'TPM_USER' ); 

(如果您有跨模式依赖项,请使用all_constraints)