Oracle10g Oracle 10g Express:禁用约束不是真正禁用约束?

Oracle10g Oracle 10g Express:禁用约束不是真正禁用约束?,oracle10g,constraints,Oracle10g,Constraints,我有一个毛茸茸的系统,几乎有650个相互连接的表,其中有大量双向引用,这些引用是通过Hibernate脚本创建的。我需要根据所有表中存在的ID删除剩余的损坏数据。我已经编写了一个脚本来生成程序来禁用每个表上的约束,例如: create or replace procedure disable_MyTable as BEGIN FOR r IN ( SELECT TABLE_NAME, CONSTRAINT_NAME FROM USER_CONSTRAINTS WHERE TA

我有一个毛茸茸的系统,几乎有650个相互连接的表,其中有大量双向引用,这些引用是通过Hibernate脚本创建的。我需要根据所有表中存在的ID删除剩余的损坏数据。我已经编写了一个脚本来生成程序来禁用每个表上的约束,例如:

create or replace procedure disable_MyTable as
BEGIN
  FOR r IN (
    SELECT TABLE_NAME, CONSTRAINT_NAME
    FROM USER_CONSTRAINTS WHERE TABLE_NAME = 'MyTable') LOOP
    EXECUTE IMMEDIATE REPLACE(REPLACE(
      'ALTER TABLE #TABLE# DISABLE CONSTRAINT #CON#'
      ,'#TABLE#',r.TABLE_NAME)
      ,'#CON#',r.CONSTRAINT_NAME);
END LOOP;
END;
/
其次是:

exec disable_MyTable;
随后是我的删除,因此我有时会收到以下错误:

ORA-02292: integrity constraint (XXX.FK409) violated - child record found
当我检查约束的状态时:

select status from user_constraints where table_name = 'MyTable';
Oracle表示所有约束仍处于启用状态

程序是否在自己的实例中执行?我需要更高的特权吗

p、 我不在乎表现。这只是一个清理脚本。

如果语句select status from user_constraints,其中table_name='MyTable'确实返回了一行,那么您需要在ALTER语句中的表占位符周围加上双引号。因为在这种情况下,MyTable区分大小写,需要双引号

您正在生成以下语句

ALTER TABLE MyTable DISABLE CONSTRAINT FK409ADEF4HERW;
但它应该是:

ALTER TABLE "MyTable" DISABLE CONSTRAINT FK409ADEF4HERW;
同样,这假设SELECT语句使用的是“MyTable”,如图所示