2011-07-22 3 views
1

J'ai besoin de créer un déclencheur de mise à jour, qui ne fonctionnera que lorsque le statut de mon enregistrement est différent du dernier état enregistré.Déclencheur SQL conditionnel?

donc j'ai ce moment:

for UPDATE 
AS 
begin try 
INSERT INTO tblHistorySource(*) 
select * 
from [DELETED] 
end try 

mais je dois vérifier si shomehow tblHistorySource.status pas égal à delete.status et seulement ensuite copier les données ....

+0

Cochez la case supprimé par rapport à inséré pour voir si les valeurs sont identiques. – HLGEM

+0

à droite. mais ce que je ne peux pas comprendre otu est comment le faire –

+0

Est le déclencheur sur tblHistorySource? Si oui, quelle est la colonne de la clé primaire dans le tableau? – TheVillageIdiot

Répondre

-2

Vous pouvez faire quelque chose comme ceci:

DECLARE @statusOldValue status_type 
DECLARE @statusNewValue status_type 

SELECT @statusOldValue = status FROM deleted 

SELECT @statusNewValue= status FROM inserted 

IF (@statusOldValue<>@statusNewValue) THEN 
BEGIN 
-- Do what you want 
END 

Si vous pouvez avoir des situations dans lesquelles plus d'un registre sont mis à jour en même temps, vous devez placer WHERE clausules dans les instructions SELECT et les mettre en itérations afin de traiter tous les registres.

+0

cela a fonctionné! Je vous remercie! –

+3

Mauvais déclencheur. Ne pas utiliser. Vous ne pouvez pas supposer qu'il n'y aura qu'un seul enregistrement inséré ou supprimé. – HLGEM

+1

Ceci est une erreur très commune: vous supposez qu'une seule ligne peut être mise à jour –

1

Juste ajouter:

IF ((SELECT Status FROM Delted) <> SELECT Status FROM Inserted)) 
BEGIN 
... 
END 
+0

sont supprimés et mots-clés insérés? ou suis-je censé mettre des noms de table à la place? –

+0

Supprimé et inséré sont des ensembles de résultats générés à l'intérieur des déclencheurs. – JNK

+0

Msg 4104, niveau 16, état 1, procédure trg_SourceHistory, ligne 5 L'identificateur en plusieurs parties "DELETED.statusCode" n'a pas pu être lié. –

4

Vous voulez être prudent que vous travaillez sur un mis des données et non pas seulement un enregistrement à la fois:

INSERT INTO tblHistorySource 
SELECT * 
FROM DELETED INNER JOIN 
    INSERTED ON <<DELETED.PK = INSERTED.PK>> 
WHERE DELETED.StatusValue <> INSERTED.StatusValue; 

La condition de jointure <<DELETED.PK = INSERTED.PK>> devra être adapté à votre schéma, comme le vrai nom de StatusValue.

Si StatusValue est annulable (merci Alex), utilisez plutôt:

WHERE DELETED.StatusValue <> INSERTED.StatusValue 
    OR DELETED.StatusValue IS NULL AND INSERTED.StatusValue IS NOT NULL 
    OR DELETED.StatusValue IS NOT NULL AND INSERTED.StatusValue IS NULL; 

Ce qui pourrait probablement être simplifiée en utilisant une enveloppe ISNULL(), mais je dois connaître le type de données.

+1

C'est le meilleur choix. – HLGEM

+0

Si statusValue est nullable, vous devez tracer les changements de NULL à des valeurs non NULL, et vice versa –

+0

@AlexKuznetsov: Je vais éditer pour cela, merci. – Yuck