J'ai ce tableau:
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
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
Vous devez utiliser les pseudo-tables INSERTED
et 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 ;