IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Oracle Discussion :

Trigger annulation delete


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut Trigger annulation delete
    Bonjour,

    Je souhaite créer un trigger pour recréer une ligne supprimée.

    Explication :

    Une application peut être amenée à supprimer des lignes dans une table A. Désormais, je dois garder une trace de cette suppression. Pour cela, j'ai créé un nouveau champ IS_DELETE dans ma table A. Il n'est pas possible de modifier l'application existante (remplacer l'ordre "DELETE FROM A WHERE ID = ...) par UPDATE A SET IS_DELETE = 'Y' WHERE ID = ...).

    Je pensais donc utiliser un trigger mais j'ai un problème de table mutante.

    J'ai même essayé d'utiliser une table temporaire et d'utiliser deux trigger mais cela ne fonctionne pas.

    Script 1er trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    CREATE OR REPLACE TRIGGER TRG_IS_DELETE1
      BEFORE DELETE ON A
      FOR EACH ROW
    BEGIN	
     
    INSERT INTO A_TEMP (ID,IS_DELETE) VALUES (:old.ID,'Y');
     
    END;
    /

    Script 2ème trigger :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CREATE OR REPLACE TRIGGER TRG_IS_DELETE2
      AFTER INSERT ON A_TEMP
      FOR EACH ROW
    BEGIN	
     
    INSERT INTO A (ID,IS_DELETE)
    SELECT ID, IS_DELETE FROM A_TEMP;
     
    DELETE FROM A_TEMP;
     
    END;
    /
    Je ne sais plus trop comment m'en sortir. J'aurai aimé le gérer avec un seul trigger sans table temporaire mais j'ai l'impression que ce n'est pas possible.

    De plus, avec 2 triggers et une table temporaire, je n'y arrive même pas.

    Quelqu'un peut-il m'aider ?

    Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Indépendamment du problème de table mutante et étant donné que l'application ne peut pas être modifiée cette solution n'est pas acceptable! En fait, avez-vous pené aux interrogations sur cette table? Y a-t-il des aggrégats dans cette application sur cette table? Beaucoup de choses peuvent mal tourner dans cette application à cause de cette modification.
    Consultant et formateur Oracle

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Oui, il peut y avoir des agregats mais sans incidence car les agrégations se font uniquement sur des enregistrements qui ne peuvent pas être supprimées (il y a un champ particulier dans cette table).

    J'ai conscience qu'il peut y avoir des effets de bord non prévu et j'ai prévenu de les alerter sur ce point. (Je te rejoins)

    Mais je me demandais simplement si cela était déjà possible avec mes deux triggers (ou un seul). J'ai l'impression que c'est impossible (j'ai fait beaucoup de tests mais, à chaque fois, j'ai une erreur)

    Si c'est impossible, la question de la dangerosité ne se pose même plus.

    Merci

  4. #4
    Membre confirmé Avatar de chrifo
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    444
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 444
    Points : 481
    Points
    481
    Par défaut
    Bonjour,
    A ce moment là, pourquoi ne pas gérer la suppression logique non pas avec ce champ is_delete, mais en concervant les éléments supprimés dans une autre table ( --> votre table temporaire n'est plus temporaire, 1 seul trigger) ?
    Je penche, donc je suis

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    En fait, l'idée c'est de pouvoir visualiser à partir d'une application les données même si la ligne a été supprimée.

    En fait, il y a deux applications :
    - une qui peut être amener à supprimer un enregistrement
    - une qui visualise les enregistrements

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par lupizzz Voir le message
    Oui, il peut y avoir des agregats mais sans incidence car les agrégations se font uniquement sur des enregistrements qui ne peuvent pas être supprimées (il y a un champ particulier dans cette table).

    J'ai conscience qu'il peut y avoir des effets de bord non prévu et j'ai prévenu de les alerter sur ce point. (Je te rejoins)

    Mais je me demandais simplement si cela était déjà possible avec mes deux triggers (ou un seul). J'ai l'impression que c'est impossible (j'ai fait beaucoup de tests mais, à chaque fois, j'ai une erreur)

    Si c'est impossible, la question de la dangerosité ne se pose même plus.

    Merci
    Ta solution n'est pas valable ...
    Voici un exemple qui montre comment faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    set echo on
     
    drop table test
     
    drop table test succeeded.
    create table test ( a number, b number)
     
    create table succeeded.
    insert into test values (1, 0)
     
    1 rows inserted
    insert into test values (2, 0)
     
    1 rows inserted
    drop table test_temp
     
    drop table test_temp succeeded.
    create global temporary table test_temp
    on commit preserve rows
    as select * from test
    where 1 = 0
     
    create global succeeded.
    create or replace trigger t1
    before delete
    on test
    for each row
    begin
      insert into test_temp values (:old.a, 1);
    end;
     
    trigger t1 Compiled.
    create or replace trigger t2
    after delete
    on test
    begin
      insert into test
      select * from test_temp;
      delete test_temp;
    end;
     
    trigger t2 Compiled.
    delete test
     
    2 rows deleted
    select * from test
     
    A                      B                      
    ---------------------- ---------------------- 
    1                      1                      
    2                      1                      
     
    2 rows selected
    Il est également possible de passer par un tableau dans un package à la place de la table temporaire ...
    Consultant et formateur Oracle

  7. #7
    Membre du Club
    Inscrit en
    Février 2007
    Messages
    69
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 69
    Points : 64
    Points
    64
    Par défaut
    J'ai même essayé d'utiliser une table temporaire et d'utiliser deux trigger mais cela ne fonctionne pas.
    peu tu donner plus de detail?

  8. #8
    Futur Membre du Club
    Inscrit en
    Décembre 2007
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 13
    Points : 8
    Points
    8
    Par défaut
    Effectivement, cela fonctionne parfaitement.

    J'étais sur une mauvaise piste en voulant utiliser un trigger sur ma table temporaire.

    Merci beaucoup pour la solution.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. TRIGGER ON DELETE complexe ..
    Par XAMLdev dans le forum Développement
    Réponses: 6
    Dernier message: 07/01/2008, 12h10
  2. Trigger after delete
    Par festayre47 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 27/12/2007, 12h02
  3. [trigger] annulation du traitement
    Par kase74 dans le forum WinDev
    Réponses: 5
    Dernier message: 02/11/2007, 12h12
  4. [SQL2005]Trigger On delete, insert, update(colonne)
    Par slim dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/02/2007, 16h36
  5. [Trigger] Annuler une suppression
    Par jb084 dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/12/2006, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo