Je suis nouveau sur les déclencheurs et je veux créer un déclencheur sur une mise à jour d'une colonne et mettre à jour une autre table avec cette valeur.
J'ai table1 avec une colonne année et si l'application met à jour cette colonne année, je dois mettre à jour le tableau 2 avec l'année la même année.
ALTER TRIGGER [dbo].[trig_UpdateAnnualYear]
ON [dbo].[table1]
AFTER UPDATE
AS
if (UPDATE (intAnnualYear))
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for trigger here
Update table2 set AnnualYear = intAnnualYear where table2.ID = table1.ID
END
Vous ne faites pas référence à table1
à l'intérieur du déclencheur. Utilisez la pseudo-table inserted
pour obtenir les valeurs "après". N'oubliez pas non plus qu'une mise à jour peut affecter plusieurs lignes.
Donc, remplacez votre déclaration update
actuelle par
UPDATE table2
SET table2.annualyear = inserted.intannualyear
FROM table2
JOIN inserted
ON table2.id = inserted.id
Vous devez uniquement mettre à jour les enregistrements de la table2 si la colonne intannualyear est impliquée. En outre, il s’agit d’une syntaxe UPDATE alternative entre deux tables de ce que Martin a montré
IF UPDATE(intannualyear)
UPDATE table2
SET annualyear = inserted.intannualyear
FROM inserted
WHERE table2.id = inserted.id
Selon cette question , s'il n'y a qu'une seule table "en aval", une autre option avec une relation de clé étrangère correctement définie serait la mise à jour en cascade.
Pour compléter les réponses ci-dessus, si vous devez vérifier plusieurs colonnes, vous pouvez utiliser un INNER JOIN entre les appels insérés et supprimés, ou plusieurs appels UPDATE ():
IF ( UPDATE(Col1) OR UPDATE(Col2) ) BEGIN ...