Oracle PL SQL禁用数据库表的所有约束

时间:2014-07-30 14:59:26

标签: sql oracle plsql oracle11g

我尝试禁用所有数据库表的所有约束。该数据库名为“database_test”。性能不是问题。

我写了一个pl / sql脚本,它给了我表的所有约束。

我的问题是:当我运行脚本时,SQL开发人员会说“ORA-00972:标识符太长”。但我只使用数据库中已定义的字段。

CREATE OR REPLACE PROCEDURE DISPLAY_CONSTRAINT_DATABASE AS 
BEGIN
    FOR i IN (SELECT DISTINCT OWNER, OBJECT_NAME FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'TABLE' AND OWNER = 'DB_NAME')
    LOOP
        FOR j IN (SELECT CONSTRAINT_NAME FROM ALL_CONSTRAINTS WHERE owner = i.OWNER AND table_name = i.OBJECT_NAME AND CONSTRAINT_TYPE='R')
        LOOP
            dbms_utility.exec_ddl_statement('alter table "DB_NAME.' || i.OBJECT_NAME || ' DISABLE CONSTRAINT ' || j.CONSTRAINT_NAME);
        END LOOP; 
    END LOOP; 
END DISPLAY_CONSTRAINT_DATABASE;

1 个答案:

答案 0 :(得分:3)

你的双引号错了。您正在生成如下的SQL语句:

alter table "DB_NAME.FOOBAR disable constraint some_constraint;

哪个错过了第二个双引号(我的猜测是你可能想把之后的第二个引号放在表名之后也是错误的。)

您需要将标识符的每个部分都放在引号中,而不是整个内容:

alter table "DB_NAME"."FOOBAR" disable constraint some_constraint;

我也没有看到使用dbms_sql的必要性:

execute immediate 'alter table "DB_NAME"."' || i.OBJECT_NAME || '" DISABLE CONSTRAINT ' || j.CONSTRAINT_NAME;   

为避免重复拥有者,我实际上会将语句更改为:

execute immediate 'alter table "'||j.owner||'"."' || i.OBJECT_NAME || '" DISABLE CONSTRAINT ' || j.CONSTRAINT_NAME;   

因此,您只需要在程序中对所有者名称进行“硬编码”。