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 de type "for insert,update"


Sujet :

Développement SQL Server

  1. #1
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2006
    Messages : 152
    Points : 131
    Points
    131
    Par défaut TRIGGER de type "for insert,update"
    BOnjour,

    J'ai créé un déclencheur qui porte à la fois sur l'insertion et la mise à jour dans une table qui porte la contrainte de clé étarngère suivante :

    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
    alter table "Employe"
    	add constraint "Service_Employe_FK1" foreign key (
    		"code_service")
    	 references "Service" (
    		"code_service") on update no action on delete no action  
     
    CREATE TRIGGER trEmploye
    ON Employe
    FOR INSERT,UPDATE
    AS
    IF UPDATE(code_service)
      BEGIN
        DECLARE @newCodeService NVARCHAR(6)
        SELECT @newCodeService = (SELECT code_service FROM Inserted)
        IF NOT EXISTS(SELECT code_service FROM Service WHERE Service.code_service=@newCodeService)
          INSERT INTO Service
          VALUES (@newCodeService, @newCodeService, NULL)
          COMMIT
      END;
    En tentant une insertion sur la table 'Employe', avec une valeur de 'code_service' non référencée dans la table 'Service', j'obtiens le message d'erreur suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg 547, Level 16, State 0, Line 2
    L'instruction INSERT est en conflit avec la contrainte FOREIGN KEY 'Service_Employe_FK1'. Le conflit s'est produit dans la base de données 'BDD_Absences', table 'dbo.Service', column 'code_service'.
    Comment remédier à cela ?

  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
    les triggers sous sql 2000 sont de type "after", ce qui fait ta contrainte est vérifiée avant l'exécution de ton trigger. Au final, il te faut choisir entre ta contrainte et ton trigger, les 2 étant un peu contradictoires. ta FK empêche l'insertion d'un ligne dans "employe" sans code correspondant dans "service" et ton trigger permet l'insertion d'un code manquant ...
    Emmanuel T.

  3. #3
    Membre habitué
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2006
    Messages
    152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information

    Informations forums :
    Inscription : Mai 2006
    Messages : 152
    Points : 131
    Points
    131
    Par défaut DECLENCHEUR pour "insert,update"
    Salut à tous,

    Alors je me rends compte que le type de trigger ne permet pas de réaliser ce que je veux.
    PAr contre un déclencheur de type "INSTEAD OF INSERT" et d'autre part un "INSTEAD OF UPDATE" permettent de réaliser ca, la syntaxe est très explicite et on a deux déclencheurs déclarés séparément.

    A bientôt pour de nouvelles aventures !

    Sam ;

  4. #4
    Expert confirmé
    Avatar de rudib
    Homme Profil pro
    Fakir SQL Server & NoSQL
    Inscrit en
    Mai 2006
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Fakir SQL Server & NoSQL

    Informations forums :
    Inscription : Mai 2006
    Messages : 2 573
    Points : 4 043
    Points
    4 043
    Par défaut
    Bonjour,

    On ne cessera de le répéter : attention aux variables dans les triggers ! la table INSERTED peut contenir plusieurs lignes !

    Merci de penser au tag résolu.
    Rudi Bruchez
    Rudi Bruchez EIRL, solutions MS SQL Server et NoSQL
    LinkedIn - [Outil libre de diagnostic SQL Server : Sql Trismegiste]
    LIVRES : Optimiser SQL Server -
    Microsoft SQL Server 2012 Security Cookbook
    - les bases de données NoSQL

    e-learning : LinkedIn Learning - Pluralsight

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

Discussions similaires

  1. création d'un seul trigger for insert, delete, update
    Par gilardino dans le forum Développement
    Réponses: 2
    Dernier message: 23/04/2009, 01h41
  2. [Wamp] Problème d'insertion avec quote d'un formulaire
    Par cyberdevelopment dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 20/08/2006, 18h55
  3. [trigger] insert update et delete
    Par kooljy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 13/07/2006, 08h56
  4. TRIGGER avec inserted + UPDATE sur INSERTED
    Par shaka84 dans le forum Développement
    Réponses: 3
    Dernier message: 12/04/2006, 10h26
  5. [VBnet][Access] Requete imbriquee "insert + select"
    Par Fab62_ dans le forum Windows Forms
    Réponses: 3
    Dernier message: 06/03/2006, 13h58

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