web-dev-qa-db-fra.com

Comment référencer uniquement les lignes affectées dans le déclencheur AFTER UPDATE

J'ai ce tableau:

enter image description here

Et j'essaie de créer un déclencheur de mise à jour qui mettra à jour last_updated_on = GETDATE() et last_updated_by = SYSTEM_USER colonnes chaque fois qu'une mise à jour est effectuée sur step_number ou step_name colonne.

J'ai commencé à le créer par

ALTER TRIGGER tr_app_bread_crumbs_afterupdate
ON [dbo].[app_bread_crumbs]
AFTER UPDATE
AS
BEGIN 
    UPDATE [dbo].[app_bread_crumbs]
    SET last_updated_by = SYSTEM_USER,
    last_updated_on = GETDATE()
END

Mais cela mettra à jour toutes les lignes à la fois. J'essaie de comprendre comment spécifier de ne mettre à jour que last_updated_on et last_updated_by par le déclencheur de la ligne spécifique sur laquelle les mises à jour sont effectuées.

Par exemple, s'ils mettent à jour:

UPDATE [dbo].[app_bread_crumbs]
    SET step_name = 'DAMAGE' WHERE step_number = 1

Seule la première ligne doit être mise à jour par le déclencheur

6
Pawel85

Utilisez la table inserted, qui est une table spéciale disponible à l'intérieur des déclencheurs contenant les lignes qui seront mises à jour/insérées dans la table.

ALTER TRIGGER tr_app_bread_crumbs_afterupdate
ON [dbo].[app_bread_crumbs]
AFTER UPDATE
AS
BEGIN 
    UPDATE [dbo].[app_bread_crumbs]
    SET last_updated_by = SYSTEM_USER,
    last_updated_on = GETDATE()
    FROM dbo.app_bread_crumbs abc
    WHERE EXISTS (SELECT 1 FROM inserted i WHERE i.id = abc.id);
END
10
Max Vernon

Vous devez utiliser les pseudo-tables INSERTEDet DELETED. Une façon de procéder:

ALTER TRIGGER tr_app_bread_crumbs_afterupdate
ON [dbo].[app_bread_crumbs]
AFTER UPDATE
AS
BEGIN
    UPDATE upd
    SET last_updated_by = SYSTEM_USER,
        last_updated_on = GETDATE()
    FROM [dbo].[app_bread_crumbs] AS upd
      JOIN Inserted AS i
        ON i.id = upd.id
      JOIN Deleted AS d
        ON d.id = i.id
    WHERE NOT EXISTS                              -- only when any      
            ( SELECT i.sep_number, i.step_name    -- of the 2 columns
            INTERSECT                             -- changed
              SELECT d.sep_number, d.step_name
            ) ;
END ;
5
ypercubeᵀᴹ