0
USE [MY_DATABASE_NAME]
GO
/****** Object:  Trigger [dbo].[trg_After_Update]    Script Date: 16.12.2014 23:13:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[trg_After_Update]
ON [dbo].[MY_TABLE_NAME] 
FOR UPDATE
AS
    declare  @FOR_DATE date;
    declare @WRITTEN_ON smalldatetime;
    declare @WRITTEN_BY_WHO NVARCHAR(50); 
    declare @REPORT nvarchar(max);
    declare @HANDLED bit; 
    declare @HANDLED_BY NVARCHAR(50);
    declare @HANDLED_WHEN datetime;
    declare @COMMENT nvarchar(max);
    declare @AUDIT_ACTION NVARCHAR(50);
    declare @AUDIT_TIMESTAMP smalldatetime;


    select @FOR_DATE     = i.FOR_DATE from inserted i;  
    select @WRITTEN_ON = i.WRITTEN_ON from inserted i;
    select @WRITTEN_BY_WHO = i.WRITTEN_BY_WHO from inserted i;
    select @REPORT         = i.REPORT from inserted i;
    select @HANDLED      = i.HANDLED from inserted i;
    select @HANDLED_BY = i.HANDLED_BY from inserted i;
    select @HANDLED_WHEN = i.HANDLED_WHEN from inserted i;
    select @ COMMENT       = i.COMMENT from inserted i;

                   if update(REPORT)
        set @audit_action='Report change';
        if update(COMMENT)
        set @audit_action='Comment change';
        if update(HANDLED)
        set @audit_action='Handled change';

                        insert into AUDIT_MY_TABLE_NAME


(FOR_DATE,WRITTEN_ON,WRITTEN_BY_WHO,REPORT,HANDLED,HANDLED_BY,HANDLED_WHEN,COMMENT,USER,AUDIT_ACTION,AUDIT_TIMESTAMP) 
    values

(@FOR_DATE,@WRITTEN_ON,@WRITTEN_BY_WHO,@REPORT,@HANDLED,@HANDLED_BY,@HANDLED_WHEN,@COMMENT,USER_NAME(USER_ID()),@audit_action,getdate());

このトリガーは、ほぼ期待どおりに機能します。3 つの監視対象フィールドへの変更をログに記録します。ただし、このテーブル 'MY_TABLE_NAME' に新しいレコードを挿入すると、上記のトリガーが発生します。次に、監査テーブル 'AUDIT_MY_TABLE_NAME' を見に行くと、この新しいレコードがそこに追加されていることがわかります。唯一の違いは、「audit_action」フィールドが空であることです。この監査テーブルへの挿入は、'MY_TABLE_NAME' after_insert の 2 つのフィールドを更新する別のトリガーが原因である可能性があります。

私の質問は次のとおりです。このトリガーの仕組みが好きです。追加したい唯一の追加機能は、「audit_action」が現在空を表示する代わりに「新しいレコード」を読み取ることです。新しいレコードはログに記録していませんが、この After_Update トリガーはいずれにせよそれらをログに記録します。では、この「after_update」トリガーで何を変更すれば、新しいレコードの挿入が発生したときに「audit_action」が監査テーブルで「新しいレコード」を読み取るようになりますか?

4

1 に答える 1