2017-07-10 1 views
0

J'ai un SQL Server 2012 Mise à jour de déclenchement qui se produit lorsque les données sont mises à jour dans une table dans la base de données (Microsoft Project Database Server) :)Comment vérifier UPDATE Trigger si l'enregistrement a vraiment changé

J'utilise le déclaration suivante pour obtenir l'élément mis à jour de la table dans le déclenchement

SELECT @dataId = INSERTED.Id FROM INSERTED; 

Mais le problème est dû au comportement du serveur Microsoft Project, qu'il met à jour toutes les tâches d'un projet, même si une seule tâche a été modifiée (chaque Tâche est un enregistrement dans la base de données).

Je sais que je peux obtenir l'id de l'article qui devrait être mis à jour, mais je ne sais pas comment je pourrais comparer la ligne mise à jour avec les données qui sont toujours dans la base de données dans le déclencheur UPDATE?

+1

La première question que je vois ici est que vous utilisez des valeurs scalaires dans votre déclencheur. C'est un énorme drapeau rouge que vous supposez qu'il n'y aura qu'une seule valeur insérée. Ce n'est pas comment les déclencheurs fonctionnent. Ils tirent une fois par opération, pas une fois par rangée. Votre déclencheur doit être défini en fonction de. Si vous voulez vérifier la valeur actuelle par rapport à la nouvelle valeur que vous joindriez insérée à votre table de base. Si les valeurs sont différentes, cela a changé. –

+0

Merci Sean. Mais a) comment une meilleure pratique pourrait-elle ressembler? b) J'ai besoin de comparer plus d'un seul champ, disons 7-8 champs. – STORM

Répondre

2

Pour obtenir ce que les lignes réellement changé, utilisez ce à l'intérieur du déclencheur

SELECT 
    * 
FROM 
    INSERTED I 
    JOIN 
    DELETED D ON I.KeyCol = D.KeyCol 
WHERE 
    NOT EXISTS (
    SELECT I.Col1, I.Col2, I.Col3, I.Col4 ... 
    INTERSECT 
    SELECT D.Col1, D.Col2, D.Col3, D.Col4 ... 
    ) 

Le NOT EXISTS..INTERSECT deals with NULLs etc pour vous déjà

+0

très bien GBN - vous écrivez toujours du code génial. –