web-dev-qa-db-fra.com

Procédure Oracle pour activer / désactiver toutes les contraintes

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.

3
mnowotka

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');
4
Leigh Riffel

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