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 after update


Sujet :

Développement SQL Server

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut Trigger after update
    Bonjour,
    je voudrais créer un trigger afterupdate sur une table1 en pour mettre a jour les donnée de la table2 dé qu'un champ et modifier sur la table1 .

    Si quelqu'un pouvait m'éclairer, ça m'aiderait grandement !

    Merci d'avance

  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,

    Il faudrait poster la structure des deux tables, indiquer ce que vous voulez faire
    et indiquer surtout ce que vous avez déjà fait et là où se trouve votre problème.

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par aieeeuuuuu Voir le message
    Bonjour,

    Il faudrait poster la structure des deux tables, indiquer ce que vous voulez faire
    et indiquer surtout ce que vous avez déjà fait et là où se trouve votre problème.

    la structure des deux table (table des article) et identique .
    table 1 sur base 1, table 2 sur base 2.
    je veux synchroniser les deux base exactement, dé que je modifier un article j'aurais la même modification sur l'autre base .

  4. #4
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Tu peux faire quelque chose comme cela

    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
    CREATE TRIGGER	dbo.TR_Table1_IUD  
       ON  dbo.Table1 
       AFTER INSERT, UPDATE, DELETE 
    AS	
    BEGIN 
    	SET NOCOUNT ON 
    	;WITH Source AS  (
              SELECT  I.Id AS I_Id 
    		, I.Col2
    		, I.Col3 
    		, I.Col4 
    		, etc.. 
    		, .... 
    		, D.Id AS D_Id 
    	 FROM Inserted	 I 
    	 FULL OUTER JOIN Deleted D 
    	   ON D.Id = I.Id )
     
    	MERGE INTO dbo.Table2 As Target 
    	USING Source 
    	On Source.I_Id = Target.Id 
     
    	WHEN MATCHED  THEN   -- sous entend  Target.Id  = I_Id
    	UPDATE 
    		SET   Target.Col2 = Source.Col2 
    			, Target.Col3 = Source.Col3
    			, Target.Col4 = Source.Col4
    			, etc..						
    	WHEN NOT MATCHED BY Target AND Source.I_Id IS NOT NULL  THEN   -- la clause AND Source.I_Id IS NOT NULL  est facultatif, c'est juste pour la forme et la clarté
    	INSERT 
    	 ( Id, Col2, Col3, ..... ) 
    	VALUES 
    	( Source.I_Id, Source.Col2, Source.Col3, .... ) 
     
    	WHEN NOT MATCHED BY Source AND Target.Id = D_Id 
    	THEN  DELETE; 
     
    END;
    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Je ne pense pas qu'un trigger soit la meilleure solution ici.
    Si vous voulez répliquer des données, utilisez les mécanismes de réplication transactionnelle.

  6. #6
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Je ne pense pas qu'un trigger soit la meilleure solution ici.
    Si vous voulez répliquer des données, utilisez les mécanismes de réplication transactionnelle.

    Bonjour.
    merci de m'expliquer comment paramétré cette réplication transactionnelle.

  7. #7
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut
    Citation Envoyé par hmira Voir le message
    Tu peux faire quelque chose comme cela

    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
    CREATE TRIGGER	dbo.TR_Table1_IUD  
       ON  dbo.Table1 
       AFTER INSERT, UPDATE, DELETE 
    AS	
    BEGIN 
    	SET NOCOUNT ON 
    	;WITH Source AS  (
              SELECT  I.Id AS I_Id 
    		, I.Col2
    		, I.Col3 
    		, I.Col4 
    		, etc.. 
    		, .... 
    		, D.Id AS D_Id 
    	 FROM Inserted	 I 
    	 FULL OUTER JOIN Deleted D 
    	   ON D.Id = I.Id )
     
    	MERGE INTO dbo.Table2 As Target 
    	USING Source 
    	On Source.I_Id = Target.Id 
     
    	WHEN MATCHED  THEN   -- sous entend  Target.Id  = I_Id
    	UPDATE 
    		SET   Target.Col2 = Source.Col2 
    			, Target.Col3 = Source.Col3
    			, Target.Col4 = Source.Col4
    			, etc..						
    	WHEN NOT MATCHED BY Target AND Source.I_Id IS NOT NULL  THEN   -- la clause AND Source.I_Id IS NOT NULL  est facultatif, c'est juste pour la forme et la clarté
    	INSERT 
    	 ( Id, Col2, Col3, ..... ) 
    	VALUES 
    	( Source.I_Id, Source.Col2, Source.Col3, .... ) 
     
    	WHEN NOT MATCHED BY Source AND Target.Id = D_Id 
    	THEN  DELETE; 
     
    END;
    A+


    Msg*5315, Niveau*16, État*1, Procédure*trgAfterupdate, Ligne*7
    La cible d'une instruction MERGE ne peut pas être une table distante, une vue distante ou une vue sur des tables distantes.

  8. #8
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par zakaryae Voir le message
    Msg*5315, Niveau*16, État*1, Procédure*trgAfterupdate, Ligne*7
    La cible d'une instruction MERGE ne peut pas être une table distante, une vue distante ou une vue sur des tables distantes.
    Oui l'erreur est tout ce qu'il y a de normal ! C'est mentionné en clair dans la BOL : "target_table ne peut pas être une table distante"

    Il faut que précisiez votre contexte, il faut que vous donniez plus d'informations sur votre architecture ; précisez par exemple si vous utilisez des Serveur liés, des transactions distribuées, etc.

    Si d'aventure, la table Table2 est située sur un Serveur lié distant (?) Ce serait complètement stupide de vouloir mettre à jour la table 2 de manière synchrone !

    En effet, votre Serveur lié distant peut très bien être, par moment, injoignable, et ce , pour diverses raisons (informations de connexion erronées, problèmes de réseau etc.) et pendant ce temps, vous n'allez tout de même pas bloquer votre système de production !

    Le mécanisme de la réplication transactionnelle, déjà soufflé ci-dessus par Waldar, est justement prévu pour apporter une solution viable à ce genre de problématique, et est de loin la mieux appropriée.

    Maintenant, si cela vous chante, vous pouvez toujours inventer une solution faite maison ; consigner les données modifiées, puis avoir recours aux tâches planifiées, etc. pour la synchronisation.

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut
    Les 2 serveurs sont liés, j'ai déjà créé un trigger afterinsert son but est de créer l'article sur srv2.base2 après ça création sur srv1.base1.
    Maintenant ce que jeux faire c'est si l'article a été modifié ou supprimé sur srv1.base1 il doit être modifié ou supprimé sur srv2.base2

  10. #10
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Pouvez-vous poster la structure des 2 Tables (Table1 et Table2) supposées être identiques, poster également le trigger after Insert que vous avez déjà rédigé. Nous pourrions ainsi mieux vous aider pour la suite.

    Sachant que, comme je l'ai déjà expliqué ci-dessus, la mise à jour synchrone, par trigger, de la table distante table2 me parait une solution hasardeuse, mais bon, c'est votre choix, vous verrez les problèmes à l'usage !

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut
    Le trigger afterinsert :
    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 trgAfterupdate ON  [nom base1].[dbo].[ARTICLE]
    FOR update
    AS  
        update
            [nom serveur2].[nom base 2].[dbo].[ARTICLE] 
        set
            GA_libelle=u.GA_LIBELLE,
                                   GA_CODEARTICLE =u.GA_codearticle
     
        from
            [mar2008].[dbo].[ARTICLE] as i 
            inner join inserted u 
        on
            i.GA_LIBELLE = u.GA_LIBELLE
            and
           i.GA_codearticle = u.GA_codearticle


    vous me proposez de faire la réplication transactionnelle ?

  12. #12
    Membre expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Points : 3 173
    Points
    3 173
    Par défaut
    Bonjour les perfs le trigger faisant partie de votre transaction!

    En effet réplication transactionnelle...
    Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir.
    MCTS Database Development
    MCTS Database Administration

  13. #13
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Oui, l'idéal comme cela a déjà été dit, c'est la réplication transactionnelle.

    Le trigger que vous venez de poster est un Trigger After Update et non pas after Insert !

    Par ailleurs, même dans ce trigger after update je ne vois pas bien l'intérêt de la colonne libellée dans la clause ON de l'instruction Update (?)
    (i.GA_LIBELLE = u.GA_LIBELLE) !!!

    Ce ce fait votre Trigger after update ne sert à rien ! puisqu'il réaffecte les mêmes valeurs des 2 colonnes GA_libelle et GA_CODEARTICLE puisque celles-ci sont préalablement vérifiées dans la clause ON de la jointure interne de l'instruction Update !

    Que représente [Mars2008] ? représente-elle [Nom base 2] ?

    A défaut d'avoir la structure de la table Article, quelle est au moins la clé primaire de la table ARTICLE ?
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

  14. #14
    Nouveau Candidat au Club
    Inscrit en
    Janvier 2011
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 25
    Points : 0
    Points
    0
    Par défaut
    DSL voici le trigger afterinsert


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TRIGGER trgAfterInsert ON  [base1].[dbo].[ARTICLE]
    FOR INSERT
    AS  
        insert into [base2].[dbo].[ARTICLE]
               (ga_codearticle,ga_libelle) 
        SELECT ga_codearticle,ga_libelle
        FROM inserted;

    il n y a pas de clé primaire sur la table article

  15. #15
    Membre expérimenté

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    733
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2003
    Messages : 733
    Points : 1 668
    Points
    1 668
    Billets dans le blog
    8
    Par défaut
    Citation Envoyé par zakaryae Voir le message
    il n y a pas de clé primaire sur la table article
    Vous voulez synchroniser des tables qui ne sont même pas dotées d'une clé primaire ! Autant jouer à la roulette russe.

    Les tables sans clé primaires sont généralement déconseillées ! Le modèle relationnel impose à priori, parmi les règles d'intégrité structurelle, une règle minimale, celle de l'unicité des clés.

    En outre, il est impossible de créer une réplication transactionnelle sur les tables sans clé primaire.

    La connerie ne s'arrêtera donc t-elle jamais ?

    A+
    "Une idée mal écrite est une idée fausse !"
    http://hamid-mira.blogspot.com

Discussions similaires

  1. Trigger After Update avec la table Deleted vide ?
    Par azur668 dans le forum Développement
    Réponses: 4
    Dernier message: 24/06/2009, 23h41
  2. Problème exécution trigger after update
    Par Fabien85 dans le forum Développement
    Réponses: 19
    Dernier message: 15/01/2009, 17h35
  3. Réponses: 5
    Dernier message: 15/06/2007, 16h05
  4. Trigger After Update
    Par hair_peace dans le forum Oracle
    Réponses: 8
    Dernier message: 23/08/2006, 21h10
  5. TRIGGER After Update
    Par Nounoursonne dans le forum Oracle
    Réponses: 8
    Dernier message: 20/07/2005, 13h33

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