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 :

problème avec un trigger - conditionner le lancement sur le contenu d'une colonne


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut problème avec un trigger - conditionner le lancement sur le contenu d'une colonne
    Bonjour,

    N'etant pas famillier de SQL server, je tourne un peu en rond avec mon TRIGGER.

    Le trigger d'une table doit executer une procédure stockée à condition que les valeurs de deux colonnes soient égales aux conditions définies.
    Si les conditions sont vraies, la procédure devrait être executée avec la valeur d'une autre colonne de la table du trigger.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TRIGGER le_trigger
    ON la_table
    AFTER UPDATE
    AS
    IF UPDATE (colonne1 = 'abc') AND  UPDATE(colonne2='cba') 
    BEGIN 
     
      EXEC procedure_stockee 'colonne3'
     
      IF @@Error <> 0
      ROLLBACK TRANSACTION
     
    END
    Evidement ce n'est pas aussi simple

    Auriez-vous une piste ?

    Merci

  2. #2
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Après recherche j'arrive à ce genre de trigger

    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
    CREATE TRIGGER le_trigger
    ON la_table
    AFTER UPDATE
    AS
    IF UPDATE (colonne1) AND  UPDATE(colonne2) 
     
    BEGIN 
      DECLARE @col1 VARCHAR(20) 
      DECLARE @col2 INT
      DECLARE @col3 INT
     
      SELECT @col1= colonne1, @col2 = colonne2, @col3 = colonne3
      FROM INSERTED
     
      IF @col1 = 'abc' AND @col2 = 'cba'
      BEGIN
     
        EXEC procedure_stockee @col3
     
      END
     
      IF @@Error <> 0
      ROLLBACK TRANSACTION
     
    END
    Me reste plus qu'à tester la chose. J'espère que je suis sur la bonne voie -_-'

  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,

    Effectivement cela fonctionnera, mais seulement pour la dernière ligne mise à jour.
    Essaie ceci:

    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
    CREATE TRIGGER le_trigger
    ON la_table
    AFTER UPDATE
    AS
    	IF UPDATE (colonne1) AND  UPDATE(colonne2) 
    	BEGIN
    		DECLARE @col TABLE
    		(
    			ID INT IDENTITY,
    			@col1 VARCHAR(20),
    			@col2 INT,
    			@col3 INT
    		);
     
    		DECLARE @i INT; SET @I = 1;
    		DECLARE @nb_rows INT;
     
    		INSERT @col
    		SELECT @col1 = colonne1,
    				@col2 = colonne2,
    				@col3 = colonne3
    		FROM INSERTED
    		WHERE @col1 = 'abc'
    		AND @col2 = 'cba'
     
    		WHILE @i <= @nb_rows
    		BEGIN
    			BEGIN TRY
    				EXEC procedure_stockee @col3
    			END TRY
    			BEGIN CATCH
    				-- Gestion des erreurs ...
    			END CATCH;
    			SET @i = @i + 1;
    		END;  
    END;
    Et là ça fonctionnera pour toutes les lignes mise à jour, pas seulement la dernière .

    De plus ce genre d'implémentation est un peu dangereux car toutes les transactions qui sont dans le trigger font partie de la transaction qui a déclenché le trigger, et tu risques de connaître des ralentissements voire des blocages.
    Essaie plutôt de voir si tu ne pourrais pas appeler cette procédure depuis les procédures qui déclenchent l'exécution de ce trigger

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2007
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 33
    Points : 28
    Points
    28
    Par défaut
    Merci beaucoup Elsuket.
    Bien que SQLServer n'aime pas beaucoup (j'ai laissé les noms des variables par défaut pour suivre le sujet plus facilement) :



    Ton exemple va bien m'aider à comprendre le principe.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2007
    Messages : 46
    Points : 58
    Points
    58
    Par défaut
    Bonjour,
    SQL Server n'accepte pas le TRY ! Il n'est apparu qu'à partir de la version 2005

Discussions similaires

  1. [11g] Contrainte sur le contenu d'une colonne
    Par Ptrous dans le forum SQL
    Réponses: 4
    Dernier message: 27/06/2015, 09h21
  2. Problème avec un trigger...
    Par nasgektw dans le forum Développement
    Réponses: 3
    Dernier message: 28/04/2006, 17h41
  3. [T-SQL] problème avec un trigger
    Par karine77 dans le forum Adaptive Server Enterprise
    Réponses: 3
    Dernier message: 26/09/2005, 10h45
  4. Index sur le contenu d'une colonne XMLTYPE
    Par haugoyard dans le forum Oracle
    Réponses: 7
    Dernier message: 11/04/2005, 11h10

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