web-dev-qa-db-ja.com

AFTER UPDATEトリガーで影響を受ける行のみを参照する方法

私はこのテーブルを持っています:

enter image description here

そして、更新が_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
_

トリガーによって更新されるのは最初の行のみです

6
Pawel85

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
10
Max Vernon

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 ;
5
ypercubeᵀᴹ