将3个步骤合并为一个SQL脚本

时间:2013-01-25 12:51:37

标签: sql database oracle

我对SQL很陌生,所以回答我的问题很容易。

这是我想要做的:

  1. 停用约束:

    停用数据库中的约束:

    begin
        for cur in (select fk.owner, fk.constraint_name , fk.table_name 
               from all_constraints fk, all_constraints pk 
               where fk.CONSTRAINT_TYPE = 'R' and 
                     pk.owner = 'USER1' and
                     fk.R_CONSTRAINT_NAME = pk.CONSTRAINT_NAME ) loop
            execute immediate 'ALTER TABLE '||cur.owner||'.'||cur.table_name||' MODIFY CONSTRAINT '||cur.constraint_name||' DISABLE';
        end loop;
    end;  
    
  2. 从表格中删除:

    delete from USER_TEST.Table1;                
    delete from USER_TEST.Table2;               
    delete from USER_TEST.Table3; 
    
  3. 重新激活约束:

    begin
      for cur in (select fk.owner, fk.constraint_name , fk.table_name 
                  from all_constraints fk, all_constraints pk 
                  where fk.CONSTRAINT_TYPE = 'R' and 
                        pk.owner = 'USER1' and
                        fk.R_CONSTRAINT_NAME = pk.CONSTRAINT_NAME ) loop
           execute immediate 'ALTER TABLE '||cur.owner||'.'||cur.table_name||' MODIFY CONSTRAINT '||cur.constraint_name||' ENABLE NOVALIDATE';
       end loop;
    end; 
    
  4. 有谁知道如何将这些步骤合并到一个.sql脚本中,以便我可以在Oracle SQLDeveloper上运行它?或者可能是一种更优雅的方式从表中执行删除?

    我会非常感激

1 个答案:

答案 0 :(得分:1)

如果只是从具有彼此外键的表中删除,您可以始终按约束顺序删除(“儿童优先”)。那么你根本不必弄乱你的约束。不要忘记最后提交。

如果是速度,那么你可能想要禁用约束并通过TRUNCATE而不是DELETE清空表。但是,您应该不删除架构的所有约束,而只删除受影响的表的外键,这些外键指向另一个受影响的表。这样可以防止你射入你的脚。您可以在没有循环的情况下进行此操作,只需显式禁用约束。 ë

所以整个脚本应该是这样的

Alter Table User_test.Table1 Modify Constraint FK... Disable;
Alter Table User_test.Table2 Modify Constraint FK... Disable;
...

Trunacte Table user_test.Table1;
Trunacte Table user_test.Table2;
...

Alter Table User_test.Table1 Modify Constraint FK... Enable;
Alter Table User_test.Table2 Modify Constraint FK... Enable;
...