私はこの素晴らしいコードを持っています:
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つのブール引数を受け入れる必要があります(制約を有効または無効にする必要があります)が、正直言って、これまでにプロシージャを記述したことはありません。任意の助けいただければ幸いです。
コードを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');
このための非常に単純な手順は次のようになります。
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