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 After Update avec la table Deleted vide ?


Sujet :

Développement SQL Server

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 89
    Points
    89
    Par défaut Trigger After Update avec la table Deleted vide ?
    Bonjour !
    Je suis sous SQLserver 2008

    J'ai un Trigger ON table1 AFTER INSERT, UPDATE
    Dans lequel une partie du code ne doit etre exécuté que sur INSERT
    Pour cela je teste
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if not exists (Select * from Deleted)
    Ce trigger va affecter table2, et invoquer un trigger qui va effectuer un UPDATE sur la ligne de table1 que je viens d'inserer
    Le trigger ON table1 AFTER INSERT, UPDATE est donc appelé une deuxième fois (récursivité indirecte) mais en provenance cette fois d'un UPDATE

    Problème : lorsqu'il passe sur le test : if not exists (Select * from Deleted)
    il me renvoie une table DELETED vide, comme si l'évènement déclencheur était INSERT !

    Comment faire dans ce cas pour savoir quel est l'évènement déclencheur,
    tout en gardant un seul trigger pour INSERT et UPDATE ?

    (Il y a d'autres opérations communes dans ce Trigger, qui utilisent la table INSERTED,
    il serait compliqué de déporter ce traitement dans une procédure stockée, car a ce moment je n'aurait plus accès a INSERTED)

    Merci

  2. #2
    Membre confirmé Avatar de agemis31
    Profil pro
    DBA
    Inscrit en
    Octobre 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : DBA

    Informations forums :
    Inscription : Octobre 2007
    Messages : 399
    Points : 478
    Points
    478
    Par défaut
    Bonsoir,

    C'est bizarre. Je viens de tester.

    Dans le code du trigger AFTER INSERT, UPDATE sur t1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    --Test si insertion
    IF EXISTS (SELECT * from inserted) AND NOT EXISTS (SELECT * FROM DELETED)
    BEGIN
    UPDATE t2 SET dummy = ''
    END
    Sur t2 j'ai mis un trigger AFTER UPDATE, qui modifie la ligne de plus grand id dans t1.
    Ca semble marcher puisque je ne rentre pas dans une boucle infinie en modifiant une ligne de t1 :-)

    @+

  3. #3
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Pourtant il est certain que ces tables virtuelles fonctionnent parfaitement:

    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
    CREATE TABLE TEST_TRIGGER
    (
    	uneValeur TINYINT NOT NULL
    )
    GO
     
    CREATE TRIGGER TR_A_IU_TEST_TRIGGER
    	ON dbo.TEST_TRIGGER
    AFTER INSERT, UPDATE
    AS
    BEGIN
    	SELECT uneValeur
    	FROM DELETED
    END
     
    INSERT INTO dbo.TEST_TRIGGER VALUES (1)
    GO
     
    UPDATE dbo.TEST_TRIGGER
    SET uneValeur = 2
    GO
    Retourne successivement un ensemble vide et 1.
    Ne filtrez-vous pas votre requête sur DELETED ?

    il serait compliqué de déporter ce traitement dans une procédure stockée, car a ce moment je n'aurait plus accès a INSERTED
    Ce n'est pas une raison suffisante pour ne pas le faire

    @++

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 89
    Points
    89
    Par défaut
    Houla, le week-end a été productif !
    Si j'avais su, je serai resté au bureau
    Merci pour vos réponses

    Bon, devant l'unanimité, je vais refaire des tests plus poussés.
    Je posterai le script pour reproduire le problème, ou j'avouerai mon erreur
    Citation Envoyé par elsuket Voir le message
    Ce n'est pas une raison suffisante pour ne pas le faire
    @++
    C'est vrai ! en fait, ce serai compliqué et contre-performant
    Quant a dupliquer mon code de 120 lignes dans les deux triggers, ça me semble évidement déconseillé pour la maintenance

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 89
    Points
    89
    Par défaut
    Bonsoir,
    Alors voila, j'ai refait les tests et j'ai trouvé mon erreur :
    Pour tester si c'est un Insert ou un Update qui a déclenché le trigger, ca ne suffit pas de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      IF NOT EXISTS (SELECT * FROM Deleted)
    mais plutot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IF NOT EXISTS (SELECT * FROM Deleted) and  EXISTS (SELECT * FROM Inserted)
    En effet, dans mon code le trigger after Insert générait un Update sur la même table, mais ... avec zéro lignes impactées ! et dans ce cas, le trigger est tout de même déclenché, avec la table Deleted vide ET la table Inserted aussi, ce que mon code interprétait comme un Insert et partait en boucle infinie

    Merci pour votre aide

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

Discussions similaires

  1. Trigger AFTER UPDATE avec une FOREIGN KEY
    Par brruno dans le forum Développement
    Réponses: 6
    Dernier message: 11/02/2015, 10h39
  2. [10g] Trigger after update : table mutante
    Par StephSushiSig dans le forum Oracle
    Réponses: 8
    Dernier message: 29/12/2014, 14h37
  3. Réponses: 2
    Dernier message: 11/07/2014, 11h46
  4. trigger after update avec sqldevelopper
    Par Emile87 dans le forum Oracle
    Réponses: 1
    Dernier message: 16/11/2011, 11h33
  5. trigger after update et 2 tables
    Par jeorcal dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 07/01/2011, 09h26

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