首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >禁用Oracle中的所有表约束

禁用Oracle中的所有表约束
EN

Stack Overflow用户
提问于 2008-09-24 17:45:10
回答 10查看 234K关注 0票数 98

如何使用一条命令禁用Oracle中的所有表约束?这可以是针对单个表、表列表或所有表的。

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2008-09-25 05:26:56

最好避免写出临时假脱机文件。使用PL/SQL块。您可以从SQL*Plus运行它,或者将它放入包或过程中。连接到USER_TABLES是为了避免视图约束。

您不太可能真的想禁用所有约束(包括NOT NULL、主键等)。您应该考虑将constraint_type放在WHERE子句中。

代码语言:javascript
复制
BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'ENABLED'
   AND NOT (t.iot_type IS NOT NULL AND c.constraint_type = 'P')
   ORDER BY c.constraint_type DESC)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" disable constraint ' || c.constraint_name);
  END LOOP;
END;
/

再次启用约束有点棘手-您需要先启用主键约束,然后才能在外键约束中引用它们。这可以在constraint_type上使用ORDER BY来完成。'P‘=主键,'R’=外键。

代码语言:javascript
复制
BEGIN
  FOR c IN
  (SELECT c.owner, c.table_name, c.constraint_name
   FROM user_constraints c, user_tables t
   WHERE c.table_name = t.table_name
   AND c.status = 'DISABLED'
   ORDER BY c.constraint_type)
  LOOP
    dbms_utility.exec_ddl_statement('alter table "' || c.owner || '"."' || c.table_name || '" enable constraint ' || c.constraint_name);
  END LOOP;
END;
/
票数 152
EN

Stack Overflow用户

发布于 2011-02-22 16:37:14

要计算约束之间的依赖关系,请执行以下操作:

代码语言:javascript
复制
SET Serveroutput ON
BEGIN
    FOR c IN
    (SELECT c.owner,c.table_name,c.constraint_name
    FROM user_constraints c,user_tables t
    WHERE c.table_name=t.table_name
    AND c.status='ENABLED'
    ORDER BY c.constraint_type DESC,c.last_change DESC
    )
    LOOP
        FOR D IN
        (SELECT P.Table_Name Parent_Table,C1.Table_Name Child_Table,C1.Owner,P.Constraint_Name Parent_Constraint,
            c1.constraint_name Child_Constraint
        FROM user_constraints p
        JOIN user_constraints c1 ON(p.constraint_name=c1.r_constraint_name)
        WHERE(p.constraint_type='P'
        OR p.constraint_type='U')
        AND c1.constraint_type='R'
        AND p.table_name=UPPER(c.table_name)
        )
        LOOP
            dbms_output.put_line('. Disable the constraint ' || d.Child_Constraint ||' (on table '||d.owner || '.' ||
            d.Child_Table || ')') ;
            dbms_utility.exec_ddl_statement('alter table ' || d.owner || '.' ||d.Child_Table || ' disable constraint ' ||
            d.Child_Constraint) ;
        END LOOP;
    END LOOP;
END;
/
票数 12
EN

Stack Overflow用户

发布于 2010-10-25 19:37:38

使用以下光标禁用所有约束..和alter query for enable constraints...

代码语言:javascript
复制
DECLARE

cursor r1 is select * from user_constraints;
cursor r2 is select * from user_tables;

BEGIN
  FOR c1 IN r1
  loop
    for c2 in r2
    loop
       if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN
        dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name);
       end if;
    end loop;
  END LOOP;
END;
/
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/128623

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档