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」が監査テーブルで「新しいレコード」を読み取るようになりますか?