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

MS SQL Server Discussion :

Erreur de création d'un trigger


Sujet :

MS SQL Server

  1. #1
    Membre actif
    Homme Profil pro
    Développeur Informatique WINDEV
    Inscrit en
    Novembre 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Informatique WINDEV

    Informations forums :
    Inscription : Novembre 2012
    Messages : 39
    Par défaut Erreur de création d'un trigger
    Salut Tous le monde
    J'ai voulue de créer un trigger sur SQL serveur `un trigger d'avant insertion' qui vérifie que l'utilisateur a saisie dans le champ `'jour'' 3 caractères, et que le `'salaire'' et positive ainsi que le champ `'vitesse'' et positif.

    J'ai essayé un code mes il me donne ce message :
    Msg 156, Niveau 15, État 1, Procédure TBI_Machine, Ligne 4
    Syntaxe incorrecte vers le mot clé 'THEN'.
    Msg 156, Niveau 15, État 1, Procédure TBI_Machine, Ligne 8
    Syntaxe incorrecte vers le mot clé 'ELSE'.
    Msg 156, Niveau 15, État 1, Procédure TBI_Machine, Ligne 8
    Syntaxe incorrecte vers le mot clé 'THEN'.
    Msg 156, Niveau 15, État 1, Procédure TBI_Machine, Ligne 11
    Syntaxe incorrecte vers le mot clé 'IF'.
    Msg 156, Niveau 15, État 1, Procédure TBI_Machine, Ligne 12
    Syntaxe incorrecte vers le mot clé 'THEN'.
    Msg 156, Niveau 15, État 1, Procédure TBI_Machine, Ligne 15
    Syntaxe incorrecte vers le mot clé 'IF'.
    Voila mon code :
    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
    CREATE TRIGGER TBI_Machine ON Mchine INSTEAD OF INSERT
    AS
    BEGIN
    	IF (LEN(NEW.Jour)>3) THEN
    			SELECT 'Nbr caractaire du champs jour doit etre <3' INTO EJour;
    			SELECT 'a','a' INTO EJour;
    	END IF	
    	ELSE IF (NEW.Vitesse<0) THEN
    			SELECT 'La Vitesse ne peut pas etre negative' INTO EVitesse;
    			SELECT 'a','a' INTO EVitesse;
    	END IF	
    	ELSE IF (NEW.Température < -273) THEN
    			SELECT 'La Température doit etre superieur a -273' INTO ETempérature;
    			SELECT 'a','a' INTO ETempérature;
    	END IF
    END;
    MERCI BQ

  2. #2
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 209
    Billets dans le blog
    16
    Par défaut MS SQL Server et THEN, END IF, etc.
    Bonsoir hassane03,


    T-SQL a un style de programmation structuré particulier...

    Les THEN, END IF et autres éléments classiques des langages structurés lui sont étrangers...

    Sans garantie évidemment :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    IF (LEN(NEW.Jour)>3) 
        BEGIN
            SELECT 'Nbr caractaire du champs jour doit etre <3' INTO EJour;
            SELECT 'a','a' INTO EJour;
        END 
    ELSE IF (NEW.Vitesse<0)
        BEGIN
            SELECT 'La Vitesse ne peut pas etre negative' INTO EVitesse;
            SELECT 'a','a' INTO EVitesse;
        END 
    ELSE IF (NEW.Température < -273)
        BEGIN
            SELECT 'La Température doit etre superieur a -273' INTO ETempérature;
            SELECT 'a','a' INTO ETempérature;
        END

    Vous aurez vraisemblablement d'autres surprises...


    En tout cas, bon courage et bonne année !
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  3. #3
    Membre actif
    Homme Profil pro
    Développeur Informatique WINDEV
    Inscrit en
    Novembre 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Informatique WINDEV

    Informations forums :
    Inscription : Novembre 2012
    Messages : 39
    Par défaut
    MERCI BQ mon amie pour votre répance

  4. #4
    Membre actif
    Homme Profil pro
    Développeur Informatique WINDEV
    Inscrit en
    Novembre 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Informatique WINDEV

    Informations forums :
    Inscription : Novembre 2012
    Messages : 39
    Par défaut Problème de creation d'un trigger SQL-Server
    Salut tout le monde,

    J’ai voulu créer un trigger sur SQL-Server j’ai essayé un code mais il me donne ce message :
    Msg 4104, Niveau 16, État 1, Procédure TBI_Machine, Ligne 3
    L'identificateur en plusieurs parties "NEW.Jour" ne peut pas être lié.
    Msg 4104, Niveau 16, État 1, Procédure TBI_Machine, Ligne 7
    L'identificateur en plusieurs parties "NEW.Vitesse" ne peut pas être lié.
    Msg 4104, Niveau 16, État 1, Procédure TBI_Machine, Ligne 11
    L'identificateur en plusieurs parties "NEW.Température" ne peut pas être lié.
    Si c'est possible de me donner aussi l'équivalence de 'NEW' et 'OLD' sur SQL-Server.

    Voila mon code :
    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
    CREATE TRIGGER TBI_Machine ON Machine INSTEAD OF INSERT AS
    BEGIN
    	IF (LEN(NEW.Jour)>3) 
    		BEGIN
    			SELECT 'jour doit etre en 3char' AS 'ErrJour';
    		END
    	ELSE IF (NEW.Vitesse<0) 
    		BEGIN
    			SELECT 'La Vitesse ne peut pas etre negative' AS 'EVitesse';
    		END
    	ELSE IF (NEW.Température < -273)
    		BEGIN
    			SELECT 'La Température doit etre superieur a -273' AS 'ETempérature';
    		END
    END;
    Je vous remercie les amis.

  5. #5
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 209
    Billets dans le blog
    16
    Par défaut
    L'équivalent de NEW est INSERTED et celui de OLD est DELETED.

    Cela dit, si les colonnes Jour, Vitesse et Température sont des colonnes de la table MACHINE, un trigger ne s'impose pas, les contrôles peuvent être effectués au moyen de contraintes de table :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE TABLE MACHINE
    (
            MachineId          INT          NOT NULL
          , Jour               CHAR(3)      NOT NULL   
          , Vitesse            INT          NOT NULL   
          , Température        INT          NOT NULL   
        , CONSTRAINT MACHINE_PK PRIMARY KEY (MachineId)
        , CONSTRAINT MACHINE_CHK1 CHECK (LEN(jour) <= 3)
        , CONSTRAINT MACHINE_CHK2 CHECK (Vitesse >= 0)
        , CONSTRAINT MACHINE_CHK3 CHECK (Température > -273)
    ) ;

    En notant que si la colonne Jour est du type CHAR(3) — qui logiquement devrait être du type INT —, la contrainte MACHINE_CHK1 CHECK est inutile.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  6. #6
    Membre actif
    Homme Profil pro
    Développeur Informatique WINDEV
    Inscrit en
    Novembre 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Informatique WINDEV

    Informations forums :
    Inscription : Novembre 2012
    Messages : 39
    Par défaut
    salut Tous le mande

    mon problème cet que je suis obliger d'utiliser les trigger car c un sujet d'exposer dans ma classe.dans ce expo je doit réaliser des exemple de trigger et proposer un TP pour les stagiaires. vous prouver considérer ça comme un coure réaliser par un stagiaire

  7. #7
    Membre actif
    Homme Profil pro
    Développeur Informatique WINDEV
    Inscrit en
    Novembre 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Informatique WINDEV

    Informations forums :
    Inscription : Novembre 2012
    Messages : 39
    Par défaut
    en fin j'ai pue créer le trigger mes avec ce code:

    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 TRIGGER TBI_Machine ON dbo.Machine INSTEAD OF INSERT AS
    BEGIN
    DECLARE @ErrJour VARCHAR(100);
    		SET @ErrJour='jour doit etre en 3char';
    DECLARE	@ErrVitesse VARCHAR(100);
    		SET @ErrVitesse='La Vitesse ne peut pas etre negative';
    DECLARE	@ErrTempérature VARCHAR(100);
    		SET @ErrTempérature='La Température doit etre superieur a -273';
    	IF ( (SELECT LEN(Jour) FROM INSERTED)>3) 
    		BEGIN
    			SELECT @ErrJour; --SELECT 'A','A' AS 'ErrJour';
    		END
    	ELSE IF ((SELECT Vitesse FROM INSERTED)<0) 
    		BEGIN
    			SELECT @ErrVitesse;	--SELECT 'A','A' AS 'EVitesse';
    		END
    	ELSE IF ((SELECT Température FROM INSERTED)< -273)
    		BEGIN
    			SELECT @ErrTempérature;--	SELECT 'A','A' AS 'ETempérature';
    		END
    END;
    mes le problème cet si je veut insérer un champs dans la table "Machine" si je met des valeur qui peuvent déclencher le trigger il arrête la requête mes si je rentre des champs correcte (jour <3 - temperatur <-273 ..) il n’insère pas dans la table "Machine" je c pas ou et le problème SI vous pouvez m'aider je vous serait très reconnaissant merci

  8. #8
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 209
    Billets dans le blog
    16
    Par défaut
    Bonsoir Hassane,


    Trigger pour INSERT

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IF EXISTS(SELECT name FROM sysobjects WHERE type='TR' AND name = 'MACHINE_TRIGGER_INSERT')
       DROP TRIGGER MACHINE_TRIGGER_INSERT ;

    Dans le trigger vous pouvez compter le nombre de lignes dans lesquelles les contraintes ne sont pas respectées.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    CREATE TRIGGER MACHINE_TRIGGER_INSERT ON MACHINE INSTEAD OF INSERT AS
           DECLARE @N AS INT, @Err AS Varchar(255)
     
    SET @N = (SELECT COUNT(*)  
              FROM   INSERTED
              WHERE  Vitesse < 0 OR Température <= -273 OR LEN(Jour) > 3) ;
    IF @N = 0 
        BEGIN
            INSERT INTO MACHINE SELECT * FROM INSERTED
        END
    ELSE
        BEGIN
            SET @Err = 'INSERT : LEN(Jour) < 4 et/ou Vitesse < 0 et/ou température < -272°.'
            RAISERROR (@Err, 16, 1)
        END ;

    Trigger pour UPDATE

    Je suppose ici que la table est composée des colonnes MachineId, Jour, Vitesse, Température. On sait qu’une colonne a été modifiée en effectuant le test IF UPDATE (colonne).

    Code SQL : 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
    CREATE TRIGGER MACHINE_TRIGGER_UPDATE ON MACHINE INSTEAD OF UPDATE AS
           DECLARE @N AS INT, @Err AS Varchar(255)
     
    IF UPDATE (MachineId)  
         BEGIN
            RAISERROR ('On ne touche pas aux clés primaires !', 16, 1)
            ROLLBACK TRAN
            RETURN
        END
     
    SET @N = (SELECT COUNT(*)  
              FROM   INSERTED
              WHERE  Vitesse < 0 OR Température <= -273 OR LEN(Jour) > 3) ;
    IF @N = 0 
        BEGIN
            IF UPDATE (Jour)
                BEGIN
                    UPDATE MACHINE 
                        SET Jour = (SELECT DISTINCT INSERTED.Jour 
                                    FROM   INSERTED
                                    WHERE  MACHINE.MachineId = INSERTED.MachineId
                                   )
                                    WHERE  MachineId IN (SELECT MACHINE.MachineId 
                                                         FROM   INSERTED JOIN MACHINE 
                                                             ON MACHINE.MachineId = INSERTED.MachineId)
                END
            IF UPDATE (Vitesse)
                BEGIN
                    UPDATE MACHINE 
                        SET Vitesse = (SELECT DISTINCT INSERTED.Vitesse 
                                       FROM   INSERTED
                                       WHERE  MACHINE.MachineId = INSERTED.MachineId
                                      )
                                       WHERE  MachineId IN (SELECT MACHINE.MachineId 
                                                            FROM   INSERTED JOIN MACHINE 
                                                                ON MACHINE.MachineId = INSERTED.MachineId)
                END
            IF UPDATE (Température)
                BEGIN
                    UPDATE MACHINE 
                        SET Température = (SELECT DISTINCT INSERTED.Température 
                                           FROM   INSERTED
                                           WHERE  MACHINE.MachineId = INSERTED.MachineId
                                          )
                                           WHERE  MachineId IN (SELECT MACHINE.MachineId 
                                                                FROM   INSERTED JOIN MACHINE 
                                                                    ON MACHINE.MachineId = INSERTED.MachineId)
                END
        END
    ELSE
        BEGIN
            SET @Err = 'UPDATE - LEN(Jour) < 4 et/ou Vitesse < 0 et/ou température < -272°.'
            RAISERROR (@Err, 16, 1)
        END ;


    Je vous conseille de lire la doc SQL Server à propos des triggers.

    Bon courage.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    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,

    Effectivement la solution proposée par fmsrel est la bonne, puisque la définition de ses triggers est ensembliste.

    Le trigger donné par hassane03 fonctionnera pour l'ajour d'une ligne, mais pas pour plus d'une ligne ajoutées à la table.
    Cela génère les problèmes que je décris ici

    @++

  10. #10
    Membre actif
    Homme Profil pro
    Développeur Informatique WINDEV
    Inscrit en
    Novembre 2012
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Informatique WINDEV

    Informations forums :
    Inscription : Novembre 2012
    Messages : 39
    Par défaut
    je remercie bq bq tous les ami pour leur contribution et leur aide

    il me reste un petite problème.
    le trigger s’exécute correctement il insère dans la table Machine mes si il ya des erreur dans l'insertion il n’affiche pas le message que j'ai écrie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @Err='INSERT : LEN(Jour) < 4 et/ou Vitesse < 0 et/ou température < -272°'
    RAISERROR(@Err, 16, 1)

    il bock l’exécution et donne un message de SGBD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Msg*8152, Niveau*16, État*14, Ligne*1
    Les données de chaîne ou binaires seront tronquées.
    L'instruction a été arrêtée.
    j'ai essayer la commande PRINT mes sa marche pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SET @Err='INSERT : LEN(Jour) < 4 et/ou Vitesse < 0 et/ou température < -272°'
    PRINT @Err
    je remercie encore tous les amie pour leur soutien

  11. #11
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 209
    Billets dans le blog
    16
    Par défaut
    Montrez votre trigger complet, ainsi que votre CREATE TABLE MACHINE et les INSERT/UPDATE.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

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

Discussions similaires

  1. Erreur lors de la création d'un trigger
    Par dnboa dans le forum PL/SQL
    Réponses: 7
    Dernier message: 17/09/2008, 11h58
  2. Erreur lors de la création d'un trigger
    Par max72100 dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 26/06/2008, 14h15
  3. Réponses: 6
    Dernier message: 16/07/2007, 17h11
  4. Erreur SQL1424N en création d'un trigger
    Par rapha51 dans le forum DB2
    Réponses: 2
    Dernier message: 04/06/2007, 16h30
  5. Réponses: 4
    Dernier message: 23/05/2006, 17h04

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