web-dev-qa-db-ja.com

すべての制約を有効/無効にするOracle手順

私はこの素晴らしいコードを持っています:

begin
for i in 
(
    select constraint_name, table_name 
    from user_constraints 
    where constraint_type ='R'
    and status = 'ENABLED'
) LOOP
execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';
end loop;
end;
/

私は移行にifを頻繁に使用しているので、ifからプロシージャを作成することはさらに良いでしょう。プロシージャは1つのブール引数を受け入れる必要があります(制約を有効または無効にする必要があります)が、正直言って、これまでにプロシージャを記述したことはありません。任意の助けいただければ幸いです。

3
mnowotka

コードをAUTHID CURRENT_USERパッケージに入れることをお勧めします。あなたは確かにブール値を渡すことができますが、私はVarchar2が使用法を明らかにすると思います。このコードを単体テストし、ドキュメントを追加し、エラー処理を形式化し、計装を組み込み、おそらくレポート方法を変更する必要があります。

CREATE OR REPLACE PACKAGE Maint AUTHID CURRENT_USER IS

Procedure ToggleConstraints (iNewStatus In Varchar2);

END;
/


CREATE OR REPLACE PACKAGE BODY Maint IS

Procedure ToggleConstraints (iNewStatus In Varchar2) Is
Begin
   If (UPPER(iNewStatus) NOT IN ('ENABLED','DISABLED')) Then
      Raise_Application_Error(-20001
         , 'Constraints can only be toggled to ENABLED OR DISABLED.');
   End If;

   For vConstraint In 
   (
       SELECT 'alter table ' || table_name      
         || DECODE(UPPER(iNewStatus), 'DISABLED',' disable',' enable')
         || ' constraint ' || constraint_name As Statement
       FROM user_constraints 
       WHERE constraint_type = 'R' 
       AND status = DECODE(UPPER(iNewStatus),'DISABLED','ENABLED','DISABLED')
   ) Loop
      DBMS_Output.Put_Line(vConstraint.Statement);
      execute immediate vConstraint.Statement;
   End loop;
End;


END;
/

Set serveroutput on size 1000000 format wrapped
EXECUTE Maint.ToggleConstraints(iNewStatus=>'ENABLED');
4
Leigh Riffel

このための非常に単純な手順は次のようになります。

CREATE OR REPLACE PROCEDURE sp_toggle_constraints (in_enable in boolean) is
begin

  if in_enable = false then
    for i in 
    (
      select constraint_name, table_name 
      from user_constraints 
      where constraint_type ='R'
      and status = 'ENABLED'
    ) LOOP
      execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';
    end loop;
  else
    for i in 
    (
      select constraint_name, table_name 
      from user_constraints 
      where constraint_type ='R'
      and status <> 'ENABLED'
    ) LOOP
      execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name||'';
    end loop;
  end if;


--This procedure could be made more elegant, that will be left as an exercise for the reader ;)
end;

これ(CREATE PROCEDUREのドキュメント)も参照したい場合があります。 http://docs.Oracle.com/cd/B19306_01/server.102/b14200/statements_6009.htm#SQLRF01309