我经常需要从数据库中删除用户。用户存储在名为TPM_USER
的表中。问题是,有一堆表在TPM_USER.USERID
上有一个外键约束。更糟糕的是,这些约束正在使用ON CASCADE DELETE
。前几天,我删除了一个我认为没有被任何东西使用过的用户(这是几个小时之前错误创建的重复用户),但它在没有任何警告的情况下消除了一堆重要数据。
就个人而言,我讨厌级联删除。我认为它们是危险的,只有在两个实体确实是相互依赖的情况下才应该使用它们。我希望将它们全部删除,但这种模式相当复杂,此时可能会有太大的变化。
我的问题:在DELETE
上运行TPM_USER
语句之前,我是否可以让甲骨文告诉我结果将被删除的内容?或者,如果违反任何外键,我可以暂时禁用任何级联并获取错误吗?
谢谢!
答案 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)