每隔一段时间我都必须从我们的数据库中删除用户。用户存储在名为TPM_USER
的表中。问题是,有一堆表在TPM_USER.USERID
上有外键约束。更糟糕的是,这些限制使用ON CASCADE DELETE
。有一天,我删除了一个我认为没有被任何东西使用的用户(这是几个小时前错误创建的重复用户),但它没有任何警告地清除了一堆重要数据。我可以暂时禁用Oracle中的级联删除吗?
就我个人而言,我讨厌级联删除。我认为它们很危险,只有在两个实体确实相互依赖的情况下才能使用。我很想将它们全部移除,但是这种架构相当复杂,而且这个时候可能会变得太大而无法改变。
我的问题:上运行TPM_USER
一个DELETE
声明之前,我可以让Oracle告诉我到底是什么会因此而被删除?或者,如果任何外键被违反,我是否可以暂时禁用任何级联并获得错误?
谢谢!
我个人认为,*你*的系统中的危险实体。不是'ON CASCADE DELETE'子句;-)我建议编写一个用于删除用户的存储过程,用于检查用户“可能”不应该被删除的相关情况。 – 2012-01-04 21:19:17
或者如果错误,可能会进行处理。如果您需要删除用户,指定一些标志(例如禁用,锁定,...),并在更长的时间周期(也许是几周)后删除。当然,这也会要求应用程序了解这种更改,但是更好的做法是使用删除和从备份恢复;) – rkosegi 2012-01-04 21:23:42
@LukasEder - 哦,我肯定会同意我是危险的组件,特别是玩弄一个我不明白的复杂架构,然后在我破坏事情时公开抱怨。我的问题是我如何保护自己免受级联删除造成的继承危险。 – 2012-01-04 21:34:22