J'ai ce beau morceau de code:
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;
/
J'utilise si souvent pour ma migration, il serait donc encore préférable de créer une procédure de si. La procédure devrait accepter un argument booléen (devrait-il activer ou désactiver des contraintes), mais franchement, je n'avais jamais écrit une procédure auparavant. Toute aide serait appréciée.
Je vous recommande de mettre le code dans un package authid courant_user. Vous pouvez certainement passer un booléen, mais je pense qu'un Varchar2 rend l'utilisation claire. Vous devez tester un appareil à tester ce code, ajouter une documentation, formaliser la gestion des erreurs, inclure l'instrumentation et modifier probablement la méthode de rapport.
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');
Une procédure très simple pour cela pourrait ressembler à quelque chose comme:
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;
vous voudrez peut-être lire ceci (document pour la création de procédure) également: http://docs.oracle.com/cd/b19306_01/server..102/b14200/stamps_6009.htm#ssSQLRF01309