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

Développement SQL Server Discussion :

TRIGGER ON DELETE complexe ..


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Points : 36
    Points
    36
    Par défaut TRIGGER ON DELETE complexe ..
    Bonjour à tous

    J'ai un trigger à faire sur SQLserver 2005 sur une table TRANSAC avec la clause on delete.

    Le principe est que je dois à chaque fois qu'une ligne de cette table est effacée verifier une condition puis si la condition est bonne inserer la ligne effacée dans une autre table avec un champs marquant son statut 'effacée'.

    Ce qui complique les choses c'est que la verification de la condition se fait à partir d'un requète qui comporte un ensemble de ligne
    du genre :

    select t.* from BFO BI
    inner join TRANSACTION t on BI.BUYER_ID=T.FTR_BUY_ID and BI.vendor_id=t.FTR_SUB_ID_FK
    where t.FTR_TRANS_DATE > BI.LAST_BILL_DATE


    En fait il s'agit de verifier si la ligne effacée (ayant déclenché le trigger) est bien dans l'ensemble renvoyé par la requête ci dessus et si oui faire une insertion de la ligne effacée dans une table ALPHA.

    Un PROTOTYPE du genre

    CREATE OR REPLACE TRIGGER DELETE_TRANSAC_TRIGGER
    AFTER DELETE ON TRANSAC
    BEGIN

    SI CONDITION BONNE
    INSERTION DANS ALPHA

    END


    Je suis complètement perdu dans la syntaxe pourrait on me donner une piste s'il vous plait merci

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    bonjour,

    Pour préciser, si la condition est fausse(que la requête fournie ne renvoie rien), faut-il annuler la suppression ?
    Emmanuel T.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Points : 36
    Points
    36
    Par défaut
    Si la condition est fausse, cela n'annule en aucun cas la suppression.

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    les tables DELETED et INSERTED sont des tables système (connues seulement par le trigger) contenant les enregistrements complets insérées ou supprimées par la requête initiale.

    Il faut donc les utiliser à l'intérieur d'un trigger pour pouvoir faire des comparaisons et des tests :

    ex :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create trigger trg_D_transac 
    on transaction
    for delete
    as
    	insert into	autre_table
    	select t.* from BFO BI
    inner join deleted t on BI.BUYER_ID=T.FTR_BUY_ID and BI.vendor_id=t.FTR_SUB_ID_FK
    where t.FTR_TRANS_DATE > BI.LAST_BILL_DATE
    Emmanuel T.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Points : 36
    Points
    36
    Par défaut
    C'est parfaitement ça, sauf qu'il y a encore un niveau de difficulté

    En effet, il ne faut en plus de récupérer tous les champs de la ligne supprimée, ajouter une valeur supplémentaire d'un champs de la table où se fait l'insertion.

    Je m'explique :

    La partie suivante du trigger :

    INSERT INTO autre_table
    SELECT t.* FROM BFO BI
    INNER JOIN deleted t ON BI.BUYER_ID=T.FTR_BUY_ID AND BI.vendor_id=t.FTR_SUB_ID_FK
    WHERE t.FTR_TRANS_DATE > BI.LAST_BILL_DATE


    Doit ressembler (peut être) à quelquechose du type :

    INSERT INTO autre_table
    (Nomchamps1,Nomchamps2,Nomchamps3,NouveauChamps)
    Values(t.Nomchamps1,t.Nomchamps2,t.Nomchamps3,'DELETED')

    Avec :
    Nomchamps1,Nomchamps2,Nomchamps3 appartenant à la ligne supprimée
    NouveauChamps appartenant à la table où se fait l'insertion de la ligne supprimée

    Mon ennui niveau syntaxe est que la condition de test me renvoi tous les champs à inserer (ce qui est très bien) mais comment inserer la valeur du nouveau champs dans la foulée ?


    Merci de toute l'aide que l'on pourra m'accorder

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 056
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 056
    Points : 1 216
    Points
    1 216
    Par défaut
    Il suffit de préciser quelles colonnes doivent être insérées au niveau de l'insert et de select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO autre_table (col1, col2, ...., coln)
    SELECT t.*,'DELETED' FROM BFO BI
    INNER JOIN deleted t ON BI.BUYER_ID=T.FTR_BUY_ID AND BI.vendor_id=t.FTR_SUB_ID_FK
    WHERE t.FTR_TRANS_DATE > BI.LAST_BILL_DATE
    En espérant que cela répond au problème
    Emmanuel T.

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2007
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 66
    Points : 36
    Points
    36
    Par défaut
    c'est parfait !
    Merci de ton aide
    Je met le flag résolu

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

Discussions similaires

  1. Problème avec trigger for delete
    Par tornade69 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 07/10/2008, 09h37
  2. Erreurs sur un trigger BEFORE DELETE
    Par Daikyo dans le forum PL/SQL
    Réponses: 1
    Dernier message: 13/06/2008, 02h13
  3. Trigger annulation delete
    Par lupizzz dans le forum Oracle
    Réponses: 7
    Dernier message: 02/01/2008, 14h14
  4. Trigger after delete
    Par festayre47 dans le forum PL/SQL
    Réponses: 8
    Dernier message: 27/12/2007, 12h02
  5. [SQL2005]Trigger On delete, insert, update(colonne)
    Par slim dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 27/02/2007, 16h36

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