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 :

aide sur un trigger


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 53
    Points : 35
    Points
    35
    Par défaut aide sur un trigger
    Bonjour,
    Je fais mon stage et lors d'un traitement je dois utiliser un trigger mais je n'ai pas une grande idée sur les triggers alors je voudrais votre aide si c'est possible
    voila j'ai une table
    affect_utilisateur_poste(id_utilisateur,id_poste,date_debut_affect,date_fin_affect)

    je voudrais avant l'insertion vérifier le triplet
    (id_utilisateur,id_poste,date_debut_affect)
    si le nouveau triplet à inséré est égale a celui qui existe on fait rien
    si la date_debut_affect et inférieur a la date existante remplacer la date existante avec la nouvelle
    Je sais que c'est très basique mais j'ai besoin de votre aide
    comment faire merci.

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Les triggers sont déclenchés lors d'événements sur des objets. Dans votre cas, vous voulez remplacer un ordre INSERT par votre propre code.

    Il vous faut donc créer un trigger sur votre table, sur l’évènement INSERT, qui remplace l'insertion (INSTEAD OF INSERT)
    :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE TRIGGER NomTrigger
    ON NomTable
    INSTEAD OF INSERT
    AS
    BEGIN
     
    --votre code
     
    END

    Dans votre code, vous pouvez effectuer des requêtes dans la pseudo table "INSERTED" qui à la même structure que la table sur laquelle porte le trigger, et qui contient les lignes insérées.

    Vous pouvez donc, en fonction du contenu de cette table et de la table cible, mettre le code qui convient, pour remplacer le fonctionnement normal d'une insertion par le fonctionnement que vous voulez.

    Gardez à l'esprit que ce code doit être le plus rapide possible, mettez donc les index nécessaires pour couvrir les requêtes de votre trigger

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2010
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 53
    Points : 35
    Points
    35
    Par défaut
    Merci pour la réponse
    voila ce que j'ai fair :
    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
    ALTER TRIGGER [dbo].[AFFECTATION_POSTE_UTILISATEUR_UNICITE] ON [dbo].[AFFECTATION_POSTE_UTILISATEUR]
       Instead of INSERT
       AS select * from annuaire
       DECLARE
        @id_utilisateur_existant integer,
    	@id_poste_existant integer,
    	@date_debut_affect_existante datetime
     
    	BEGIN
    	SELECT  id_utilisateur,id_poste,date_debut_affect FROM INSERTED i
        select @id_utilisateur_existant=id_utilisateur,@id_poste_existant=id_poste,@date_debut_affect_existante=date_debut_affect
        from [dbo].[AFFECTATION_POSTE_UTILISATEUR]
        if i.id_utilisateur= @id_utilisateur_existant
        insert into annuaire values('yataaa')
        else insert into annuaire values('yatooo')
        --update dbo.affectation_poste_utilisateur set date_debut_affect=convert(datetime,'2011-04-30 00:00:00.000',102)
        --else if
        END
    mais ca marche pas en faite je veux comparé la valeur inséré avec toute les valeurs de la tables et effectuer le traitement mais j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Msg*107, Niveau*16, État*2, Procédure*AFFECTATION_POSTE_UTILISATEUR_UNICITE, Ligne*17
    Le préfixe de colonne 'i' ne correspond ni au nom de table ni au nom d'alias utilisés dans la requête.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Vous n'avez pas besoin de toutes ces variables.

    De plus, certaines de vos requetes sont inutiles.

    Pensez aussi qu'il est possible en une seule requete d'inserer plusieurs lignes ! INSERTED peut donc contenir plusieurs lignes.

    Vous n'avez pas détaillé tous les cas possibles (par exemple si date_debut_affect est posterieure à la date dans la table) et vous ne détaillez pas non plus ce qu'il en est pour la date de fin

    Mais je pense que votre trigger peut se résumer en deux requêtes, un update et un insert, voire une seule avec un merge.

Discussions similaires

  1. Aide sur les triggers
    Par manuzed78 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 31/10/2012, 15h41
  2. Aide sur un trigger
    Par iop974 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 31/03/2009, 14h44
  3. aide sur les triggers en oracle
    Par tsague dans le forum Administration
    Réponses: 5
    Dernier message: 28/01/2008, 15h28
  4. Petite aide sur les triggers ?
    Par krimson dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 16/04/2004, 17h28

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