Bonjour à tous,

Ma problématique est la suivante : le schéma Oracle sur lequel je travaille comporte un nombre important de tables (+ de 2000) et j'ai donc un nombre de contraintes référentielles (clés étrangères ) en rapport.

Ces clés étrangères ne sont pas toutes "CASCADE". Or j'ai besoin parfois de pouvoir purger certains records (et donc également ceux le référençant).

Pour cela, j'ai tout d'abord coder un package PL/SQL de purge "générique" (permettant de supprimer tout record de toute table en utilisant les ROWID).
Ce package s'appuie sur le dictionnaire Oracle et recense la cartographie des tables à impacter pour faire un delete pour chacune. Cela fonctionne parfaitement mais est très très long...

Aussi, j'ai penser coder un script PL/SQL qui créée un TRIGGER BEFORE DELETE pour chaque table référencée par au moins une clé étrangère non cascade. Au sein de chacun de ces TRIGGERS, je ne supprime que les records référençant le record à supprimer via une clé étrangère NON CASCADE.

Voici un exemple de trigger généré :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
 
create or replace trigger "T_ABSE_SAIS_D"
 before delete on GRH$VISA.ABSE_SAIS for each row
begin
    if VIS$SUPPRESSION.VB_SUPP then
        delete from GRH$VISA.ACCI_DECL a where a.ABSS_ABSS_ID = :old.ABSS_ID;
        delete from GRH$VISA.AGEN_HISTO_IJ a where a.ABSS_ABSS_ID = :old.ABSS_ID;
    end if;
end;
Mon problème est que lorsque je purge un record, ça coince dès que je traite une table référencée par une clé étrangère DELETE CASCADE : Erreur ORA-04091...

Quelqu'un a-t-il déjà eu à traiter une telle problèmatique ?
Avez vous un (ou des) idée(s) ?

Merci par avance.

Nicolas