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

我可以暂时禁用Oracle中的级联删除吗?,oracle,oracle11g,Oracle,Oracle11g,有时我不得不从数据库中删除一个用户。用户存储在名为TPM\u USER的表中。问题是,有很多表在TPM\u USER.USERID上有外键约束。更糟糕的是,这些约束正在级联删除上使用。前几天,我删除了一个我认为没有被任何东西使用的用户(它是几个小时前错误创建的重复用户),但它在没有任何警告的情况下删除了一堆重要数据 就我个人而言,我讨厌级联删除。我认为它们是危险的,只有在两个实体确实相互依赖的情况下才应该使用它们。我很想把它们全部删除,但是这个模式相当复杂,而且可能会有太大的变化,所以现在不可能

有时我不得不从数据库中删除一个用户。用户存储在名为
TPM\u USER
的表中。问题是,有很多表在
TPM\u USER.USERID
上有外键约束。更糟糕的是,这些约束正在级联删除上使用
。前几天,我删除了一个我认为没有被任何东西使用的用户(它是几个小时前错误创建的重复用户),但它在没有任何警告的情况下删除了一堆重要数据

就我个人而言,我讨厌级联删除。我认为它们是危险的,只有在两个实体确实相互依赖的情况下才应该使用它们。我很想把它们全部删除,但是这个模式相当复杂,而且可能会有太大的变化,所以现在不可能一蹴而就

我的问题:在对
TPM\u用户
运行
DELETE
语句之前,我是否可以让Oracle准确地告诉我结果是什么?或者,如果违反了任何外键,我是否可以临时禁用任何级联并获得错误


谢谢

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

无论如何,可以使用以下命令禁用约束:

alter table TABLE_NAME disable constraint FK_CONSTRAINT_NAME;
(使用“启用”重新启用它)

显然,您应该知道,如果您这样做,而另一个用户从同一个表中删除,那么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' ); 

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

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

无论如何,可以使用以下命令禁用约束:

alter table TABLE_NAME disable constraint FK_CONSTRAINT_NAME;
(使用“启用”重新启用它)

显然,您应该知道,如果您这样做,而另一个用户从同一个表中删除,那么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' ); 

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

就个人而言,我认为您是系统中的危险实体。不是级联删除上的
子句;-)我建议编写一个用于用户删除的存储过程,当用户“可能”不应该被删除或处理错误时,它会检查相关情况。如果需要删除用户,请指定一些标志(例如禁用、锁定等),并在较长时间后(可能是几周)删除。当然,这也要求应用程序意识到这一变化,但这是一种比从备份中删除和恢复更常用的好做法;)@卢卡塞德——哦,我绝对同意我是一个危险的组成部分,尤其是玩弄一个我不懂的复杂模式,然后当我弄坏东西时公开抱怨。我的问题是如何保护自己免受级联删除所带来的继承危险。编写一个存储过程来删除用户是一个好主意,但需要大量反向工程来跟踪此表上的所有各种依赖项。你完全有理由说,“好,你应该这么做。”但我仍然很好奇Oracle是否支持通过任何机制解释删除级联链的想法,这将有助于在使用他们刚刚继承的数据库模式时保护自己,并且没有任何文档或任何东西。就我个人而言,我认为你是系统中的危险实体。不是级联删除上的
子句;-)我建议编写一个用于用户删除的存储过程,当用户“可能”不应该被删除或处理错误时,它会检查相关情况。如果需要删除用户,请指定一些标志(例如禁用、锁定等),并在较长时间后(可能是几周)删除。当然,这也要求应用程序意识到这一变化,但这是一种比从备份中删除和恢复更常用的好做法;)@卢卡塞德——哦,我绝对同意我是一个危险的组成部分,尤其是玩弄一个我不懂的复杂模式,然后当我弄坏东西时公开抱怨。我的问题是如何保护自己免受级联删除所带来的继承危险。编写一个存储过程来删除用户是一个好主意,但需要大量反向工程来跟踪此表上的所有各种依赖项。你完全有理由说,“好,你应该这么做。”但我仍然很好奇Oracle是否支持通过任何机制解释删除级联链的想法,这将有助于在使用刚继承的DB模式时保护自己,并且没有任何文档或任何东西。
+1
对于
select
语句获取引用表的列表,这将非常有用!如果没有更具体的答案,我会接受这个答案。
+1
对于
select
语句,可以获得引用表的列表,这将非常有用!如果没有更具体的问题,我会接受这个答案。。