私はこのテーブルを持っています:
そして、更新が_last_updated_by = SYSTEM_USER
_または_step_number
_列で実行されるたびにlast_updated_on = GETDATE()
および_step_name
_列を更新する更新トリガーを作成しようとしています。
私はそれを作成し始めました
_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
_
しかし、これはすべての行を一度に更新します。更新が行われている特定の行のトリガーによって_last_updated_on
_と_last_updated_by
_のみを更新するように指定する方法を理解しようとしています。
たとえば、更新した場合:
_UPDATE [dbo].[app_bread_crumbs]
SET step_name = 'DAMAGE' WHERE step_number = 1
_
トリガーによって更新されるのは最初の行のみです
inserted
テーブルを使用します。これは、テーブル内で更新または挿入される行を含むトリガー内で使用できる特別なテーブルです。
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
INSERTED
およびDELETED
疑似テーブルを使用する必要があります。これを行う1つの方法:
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 ;