Oracle10g Oracle 10g Express:禁用约束不是真正禁用约束?
我有一个毛茸茸的系统,几乎有650个相互连接的表,其中有大量双向引用,这些引用是通过Hibernate脚本创建的。我需要根据所有表中存在的ID删除剩余的损坏数据。我已经编写了一个脚本来生成程序来禁用每个表上的约束,例如: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
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”,如图所示