web-dev-qa-db-fra.com

Comment utiliser update trigger pour mettre à jour une autre table?

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
19
Spafa9

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  
24
Martin Smith

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
9
RichardTheKiwi

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.

1
Bilbo

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 ...
0
Z. Khullah