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 contenant du code procédural


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut Trigger contenant du code procédural
    Bonjour,

    Je souhaite créer un trigger sous MSSQL et je suis paumé avec la syntaxe et les mots-clés qui peuvent être employés (j'ai l'habitude de ce genre d'exercice sous Oracle mais pas sous MS).

    Donc, pourriez-vous m'indiquer quelques sources vraiment explicites concernant les triggers et l'utilisation de code procédural sous MSSQL ?
    (J'en ai trouvé quelques unes mais rien de bien détaillé... Dans le genre j'explique à quelqu'un qui sait déjà faire...)

    J'ai accès au MSDN et je vais me pencher dessus dès Lundi.

    En attendant, je vous explique ce que je veux faire et vous colle le code du trigger que j'ai commencé :

    -Donc, j'ai une table Question dans laquelle on trouve une colonne 'type', une colonne 'Proposition3FR' et une colonne 'Proposition4FR' (entre autres...).
    -Je souhaite, lors d'un INSERT ou UPDATE sur cette table, déclencher un trigger qui va vérifier la valeur de 'type' et affectera, en conséquence, une valeur prédéfinie à 'Proposition3FR' et 'Proposition4FR'.

    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
     
    CREATE TRIGGER [tgSetPropFRselonType] ON [dbo].[Question] 
    FOR INSERT, UPDATE 
    AS
    BEGIN
     
          IF UPDATE (type)
    	IF type = 'QCM VRAI-FAUX' OR type='chutier V/F'
    		Proposition3FR = NULL
    		Proposition4FR = NULL
     
          	IF type = 'QCM 3' OR type = 'chutier QCM3'
    		Proposition3FR = '.'
    		Proposition4FR = NULL
     
           	IF type = 'QCM 4' OR type = 'chutier QCM4'
    		Proposition3FR = '.'
    		Proposition4FR = '.'
     
    END
    Si vous pouvez m'aider à compléter, corriger ce code afin d'obtenir le résultat attendu tout en m'expliquant rapidement les tenants et aboutissants, ce serait super cool

    Merci.

  2. #2
    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 : 43
    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
    Par défaut
    Bonjour,

    Vous pouvez télécharger ou consulter la documentation complète de SQL Server.

    La commande CREATE TRIGGER est détaillée ici.

    Voici à quoi devrait ressembler votre déclencheur :

    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
    CREATE TRIGGER [tgSetPropFRselonType] ON [dbo].[Question] 
    FOR INSERT, UPDATE 
    AS
    BEGIN
    	IF UPDATE(type)
    	BEGIN
    		IF type = 'QCM VRAI-FAUX' OR type = 'chutier V/F'
    		BEGIN
    			UPDATE dbo.Question
    			SET Proposition3FR = NULL,
    				Proposition4FR = NULL
    			FROM dbo.Question Q
    			JOIN INSERTED I ON I.ID = Q.ID
    		END
     
    		IF type = 'QCM 3' OR type = 'chutier QCM3'
    		BEGIN
    			UPDATE dbo.Question
    			SET Proposition3FR = '.'
    				Proposition4FR = NULL
    			FROM dbo.Question Q
    			JOIN INSERTED I ON I.ID = Q.ID
    		END
     
    		IF type = 'QCM 4' OR type = 'chutier QCM4'
    		BEGIN
    			UPDATE dbo.Question
    			SET Proposition3FR = '.'
    				Proposition4FR = '.'
    			FROM dbo.Question Q
    			JOIN INSERTED I ON I.ID = Q.ID
    		END
    	END
    END
    La table virtuelle INSERTED (et DELETED) possède strictement la même structure que la table à laquelle est attachée le déclencheur.
    Pour faire votre mise à jour, il vous suffit donc d'effectuer une jointure entre cette table virtuelle et votre table cible.

    Vous devez délimiter chaque traitement par les mots-clé BEGIN et END.
    Sinon, vous allez exécuter la commande juxtaposée au test du IF si celui est vrai + toutes les commandes qui suivent, quel que soit le résultat de test du IF.

    Il manque le traitement en cas d'insertion, ou bien votre trigger devrait être un "FOR UPDATE"

    A+

  3. #3
    Membre confirmé
    Inscrit en
    Juin 2005
    Messages
    33
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 33
    Par défaut
    SALUT
    tester le code suivant :

    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
    CREATE TRIGGER [tgSetPropFRselonType] ON [dbo].[Question] 
    FOR INSERT, UPDATE 
    AS
    BEGIN
     
    	DECLARE @vType varchar(50),@MonID int
     
    	SELECT  @vType=type,@MonID=MonID from INSERTED
     
    	IF @vType = 'QCM VRAI-FAUX' OR @vType='chutier V/F'
    	BEGIN
    		UPDATE Question SET Proposition3FR = NULL, Proposition4FR = NULL WHERE @MonID=MonID
    	END
     
          	IF @vType = 'QCM 3' OR @vType = 'chutier QCM3'
    	BEGIN	
    		UPDATE Question SET Proposition3FR = '.', Proposition4FR = NULL WHERE @MonID=MonID
     
     	END
     
           	IF @vType = 'QCM 4' OR @vType = 'chutier QCM4'
    	BEGIN
    		UPDATE Question SET Proposition3FR = '.', Proposition4FR = '.' WHERE @MonID=MonID
     
    	END
     
    END

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    En une seule requête :

    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
    CREATE TRIGGER [tgSetPropFRselonType] ON [dbo].[Question] 
    FOR INSERT, UPDATE 
    AS
    IF UPDATE (type)
       UPDATE dbo.Question
       SET    Proposition3FR = (SELECT CASE 
                                          WHEN type = 'QCM 4' OR type = 'chutier QCM4'      THEN '.'
                                          WHEN type = 'QCM 3' OR type = 'chutier QCM3'      THEN '.'
                                          WHEN type = 'QCM VRAI-FAUX' OR type='chutier V/F' THEN NULL
                                FROM inserted i WHERE Q.ID = i.id),
              Proposition4FR = (SELECT CASE 
                                          WHEN type = 'QCM 4' OR type = 'chutier QCM4'      THEN '.'
                                          WHEN type = 'QCM 3' OR type = 'chutier QCM3'      THEN NULL
                                          WHEN type = 'QCM VRAI-FAUX' OR type='chutier V/F' THEN NULL
                                FROM inserted i WHERE Q.ID = i.id)
     
       FROM dbo.Question Q
            INNER JOIN inserted j 
                  ON j.ID = Q.ID
    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    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 : 43
    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
    Par défaut
    Saharbi, votre trigger n'est pas ensembliste.
    Donc, lorsque l'on va insérer ou mettre à jour plusieurs lignes, les traitements effectués par votre trigger ne porteront que sur la dernière ligne qui vient d'être insérée ou mise à jour, et non pas sur toutes les lignes !

  6. #6
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 997
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 997
    Billets dans le blog
    6
    Par défaut
    Contrairement à Oracle, les déclencheurs SQL Server sont uniquement ensembliste. Pas de trigger FOR EACH ROW. Votre code ne doit donc pas comporter de variables, sauf à faire appel à un curseur (à éviter si vous voulez des performances).

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  7. #7
    Membre confirmé Avatar de romulus
    Inscrit en
    Juin 2005
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 50

    Informations forums :
    Inscription : Juin 2005
    Messages : 129
    Par défaut
    Ok, merci à tous pour vos réponses

    J'ai testé les différents codes transmis.

    Je ne parviens pas à compiler le code de SQLPro ni de Elsuket car j'obtiens les erreurs suivantes (par exemple pour le code de SQLPro) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    /*-----------------------------
    CREATE TRIGGER [tgSetPropFRselonType] ON [dbo].[Question] 
    FOR INSERT, UPDATE 
    AS
    -----------------------------*/
    Serveur : Msg 156, Niveau  15, État 1, Procédure tgSetPropFRselonType, Ligne 10
    Syntaxe incorrecte vers le mot clé 'FROM'.
    Serveur : Msg 156, Niveau  15, État 1, Procédure tgSetPropFRselonType, Ligne 15
    Syntaxe incorrecte vers le mot clé 'FROM'.
    Je ne vois pas ce que peut être le problème... Apparement, la table INSERTED et son alias i ne semblent pas plaire au compilateur...


    Pour ce qui est du code de Saharbi, j'ai modifié MonID par ID (afin que cela corresponde à la table). => Trigger compilé et fonctionnel !

    J'obtiens, avec ce code les résultats escomptés, cependant, je ne comprend pas très bien la notion d'ensemblisme et de son impact dans mon cas...
    Alors si vous indiquez que celui-ci peut poser pb, je m'inquiète...


    Relativement au traitement, je souhaite effectivement que le déclencheur soit opérationnel aussi bien en insert qu'en update... A priori, tel que Elsuket l'indique, il manque le traitement pour l'insertion...
    Pour traiter l'insertion, le fait de modifier l'événement déclencheur pour le passer en AFTER au lieu de FOR me permettrait-il de ne pas avoir à ajouter de code ?

    Désolé pour ces questions un peu 'bateau', mais en passant sous microsoft, j'ai l'impression de devoir tout réapprendre....

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

Discussions similaires

  1. Optimiser un code procédural avec autoload
    Par max-mag dans le forum Langage
    Réponses: 8
    Dernier message: 25/09/2008, 15h01
  2. comment generer un trigger à partir de code delphi
    Par Bourak dans le forum Bases de données
    Réponses: 1
    Dernier message: 15/08/2007, 19h00
  3. pb variable javascript contenant du code html
    Par mgemc2 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 23/08/2006, 16h33
  4. Réponses: 5
    Dernier message: 15/06/2006, 12h03
  5. [PL/SQL] Trigger qui appelle une procédure
    Par alex6891 dans le forum Oracle
    Réponses: 5
    Dernier message: 19/01/2006, 09h01

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