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 :

SQL SERVER - Trigger INSERT/UPDATE pour autre Database [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 19
    Points : 18
    Points
    18
    Par défaut SQL SERVER - Trigger INSERT/UPDATE pour autre Database
    Bonjour à tous,

    Voici mon soucis : j'aimerais créer une copie de la table dboutillage.dbo.Table_correspondance_nuance vers une autre base de données dbfilage.dbo.NUANCESPU

    Voici mon trigger :

    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 dbo.NUANCESPUTrigger ON dbo.Table_correspondance_nuance After Insert, Update
    As
    Begin
    	DECLARE @ID as int
    	DECLARE @NUANCE as NVARCHAR(50)
    	DECLARE @CULOT as NVARCHAR(50)
    	DECLARE @GRADE as NVARCHAR(50)
     
    	SET @ID = (SELECT [ID Correspondance] FROM inserted)
    	SET @NUANCE = (SELECT [Nuance SPU] FROM inserted)
    	SET @CULOT = (SELECT [Nuance CULOT] FROM inserted)
    	SET @GRADE = (SELECT [Engineering grade] FROM inserted)
     
    If NOT Exists(select d.ID from dbfilage.dbo.NUANCESPU d where d.ID in (Select @ID from inserted))
        BEGIN
          INSERT INTO dbfilage.dbo.NUANCESPU VALUES (@ID,@NUANCE,@CULOT,@GRADE)
    	END
       ELSE
    	BEGIN           
    		UPDATE  tab 
    		SET  tab.NUANCESPU = @NUANCE,
    		SET  tab.NUANCECULOT = @CULOT,
    		SET  tab.ENGINEERINGGRADE = @GRADE,
    		WHERE tab.ID = @ID
       END
     
    END
    J'ai une erreur de syntaxe dans le UPDATE mais par ailleurs j'aimerais avoir si c'est possible et si de base je pars dans la bonne direction.

    EDIT : l'insert marche niquel.

  2. #2
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Hello,

    De base tu ne pars pas bien car les triggers sont ensemblistes par nature. Le code que tu proposes ne l'est pas.

    J'aurais également tendance à séparer en 2 triggers distincts pour chaque type d'action INSERT et UPDATE pour plus de lisibilité et de maintenance.

    ++

  3. #3
    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

    Citation Envoyé par warri0r21 Voir le message
    Bonjour à tous,

    Voici mon soucis : j'aimerais créer une copie de la table dboutillage.dbo.Table_correspondance_nuance vers une autre base de données dbfilage.dbo.NUANCESPU
    Dans quel but ? Ne serait-ce pas plus simple de créer une vue dans la base cible ?

    Citation Envoyé par warri0r21 Voir le message
    Voici mon trigger :
    [...]
    J'ai une erreur de syntaxe dans le UPDATE
    En effet, le mot clef SET ne doit être spécifié qu'une seul fois. séparez ensuite vos colonnes par une virgule.
    ça, c'est pour l'erreur de syntaxe sur la commande UPDATE mais je vous renvoi à la remarque de mikedavem concernant le coté non ensembliste de votre trigger : si plusieurs lignes sont mises à jour ou insérées en même temps, votre trigger ne traitera au mieux qu'une ligne, voire pire : il mélangera les données entre les lignes !

    Cependant, pour ma part, j'aurai bien fait un seul trigger pour INSERT et UPDATE, mais utilisé une commande MERGE pour répercuter les modifications dans la table cible.

    Citation Envoyé par warri0r21 Voir le message
    mais par ailleurs j'aimerais avoir si c'est possible et si de base je pars dans la bonne direction.
    Pas vraiment, mais je crois que vous l'aviez compris

    Détaillez un peu plus le contexte afin que l'on puisse mieux vous aider. (cf mes deux premières questions)

  4. #4
    Expert éminent sénior
    Avatar de mikedavem
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2005
    Messages
    5 450
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Distribution

    Informations forums :
    Inscription : Août 2005
    Messages : 5 450
    Points : 12 891
    Points
    12 891
    Par défaut
    Cependant, pour ma part, j'aurai bien fait un seul trigger pour INSERT et UPDATE, mais utilisé une commande MERGE pour répercuter les modifications dans la table cible.
    J'avais pensé au MERGE également mais je me suis retrouvé souvent dans des cas où les règles businees évoluaient tellement en cours de projet que la commande MERGE ne suffisait pas à répondre aux besoins .. du coup on finissait par séparer de toute façon le code de l'INSERT et de l'UPDATE pour plus de flexibilité de maintenance.

    Mais effectivement l'idée du MERGE est une très bonne idée

    ++

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    J'ai changé de méthode, je fais tout dans la même base de données. Mais cela ne change pas trop je cherche en cas d'update modifier un paramètre.

    j'explique mon problème.

    j'ai deux tables : une table Table_liste_nuance_SPU et une table Table_correspondance_nuance

    Table_liste_nuance_SPU:
    ID (PK int)
    Nuance SPU (nvarchar(50))

    Table_correspondance_nuance:
    ID (PK int)
    ID NUANCE SPU (FK relié à Table_liste_nuance_SPU, int)
    NUANCE SPU (nvarchar(50))

    J'aimerai, en fait, lorsque l'utilisateur modifie Nuance SPU dans la table Table_liste_nuance_SPU cela affecte la table Table_correspondance_nuance car ces colonnes ne sont pas reliés dans SQL (seulement leurs ID).

    J'ai tenté de faire un trigger d'update mais le multi row ne marche pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ALTER TRIGGER [dbo].[NUANCESPU]
       ON  [dbo].[Table_liste_nuance_SPU]
       FOR UPDATE
    AS 
    	UPDATE dboutillage.dbo.Table_correspondance_nuance
    	SET dboutillage.dbo.Table_correspondance_nuance.[Nuance SPU] = i.[Nuance SPU] 
    	FROM dboutillage.dbo.Table_correspondance_nuance t2
    	INNER JOIN inserted i
    	ON t2.[ID Nuance SPU] = i.[ID Nuance SPU]
     
    GO
    Merci à vous

  6. #6
    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
    a quoi sert la table Table_correspondance_nuance ?

    Pourquoi y remettre la colonne NUANCE SPU (nvarchar(50)) ?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    La table correspondance possède d'autres paramètres :

    Table_correspondance_nuance:
    ID (PK int)
    ID NUANCE SPU (FK relié à Table_liste_nuance_SPU, int)
    NUANCE SPU (nvarchar(50))
    IDCULOT (FK int)
    NUANCE CULOT(nvarchar(25))
    ENGINEERING GRADE (nvarchar(25))

    Ce sont des tables de paramètres ou un utilisateur via une appli pourra choisir une nuance (datagridview). Ces tables sont utilisées pour effectuer des calculs.
    Un programme calcul va lire ses tables et va récupérer la nuance (par exemple) pour faire ses calculs.

    Donc j'ai besoin de réaffecter la nuance dans cette table et non pas uniquement l'ID

  8. #8
    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
    Citation Envoyé par warri0r21 Voir le message

    Donc j'ai besoin de réaffecter la nuance dans cette table et non pas uniquement l'ID
    C'est précisément sur ce point surtout que vous ne partez pas dans la bonne direction : vous avez un problème de modélisation !

    Si je suis votre raisonnement, vous allez mettre en place les même déclencheur pour la table Nuance_culot...

    En faisant ainsi, non seulement vous vous compliquez la vie (mais ça vous etes en train de vous en rendre compte ) mais en plus vous augmentez artificiellement le volume de votre base, les opération d'io.... Bref, a terme, cette solution sera impossible a maintenir, et les performances vont vite être catastrophiques.

    Votre table Table_correspondance_nuance ne devrait contenir que les identifiants des NUANCE SPU et CULOT.

    Lorsque votre programme viendra chercher des données dans cette table, il lui suffira de faire une jointure avec les tables référencées pour obtenir les libellés. Vous pouvez aussi créer une vue qui contient ces informations, et votre programme fera une simple requête dans cette vue (qui aurait a peu près la même structure que votre table actuelle).

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    Rebonjour,

    Merci pour cette réponse rapide ! Certes je savais que je n'étais pas dans la bonne direction et à vrai dire j'avais pensé a faire des vues pour mieux structurer mes tables.Et pourtant j'en ai fais de la modélisation... surtout avec merise. Bref mon ancienne bdd/appli (ma toute première ) est schématisée comme ça mais je ne referais plus cette "erreur".
    Même si ça demande plus de temps en bdd, e suis parti sur le droit chemin.

    Merci sujet résolu

  10. #10
    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
    Citation Envoyé par warri0r21 Voir le message
    Même si ça demande plus de temps en bdd, e suis parti sur le droit chemin.
    Qu'est-ce qui demande plus de temps ?

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2012
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 19
    Points : 18
    Points
    18
    Par défaut
    J'avais au préalable déjà défini le programme pour cette ancienne modélisation. Etant donné que je change tout, je vais prendre plus de temps coté BDD. Mais mon code et ma bdd seront plus propres

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/09/2006, 13h56
  2. [sql server]utiliser Insert avec une clé auto
    Par nourbane dans le forum ASP
    Réponses: 6
    Dernier message: 18/05/2006, 23h02
  3. SQL SERVER Trigger et executable
    Par elkamy dans le forum Développement
    Réponses: 1
    Dernier message: 10/12/2005, 13h02
  4. Insertion dans table SQL server (Trigger) Aidz moi SVP????
    Par pop bob dans le forum Développement
    Réponses: 2
    Dernier message: 30/07/2005, 23h55
  5. MAJ d'une table sous SQL Server par insertion
    Par keish dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/06/2003, 16h23

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