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 개의 필드를 업데이트하는 다른 트리거가 원인 일 수 있습니다.After_Update 트리거 로깅
제 질문은 이것입니다 : 나는이 방아쇠가 작동하는 방식과 비슷합니다. 내가 추가하고자하는 유일한 추가 기능은 'audit_action'이 이제는 비어있는 것을 표시하는 대신 '새 레코드'를 읽는 것입니다. 걱정하지 마세요. 새 레코드를 로깅하지는 않지만이 After_Update 트리거가 어쨌든 로그를 기록합니다. 이유는 무엇입니까? 그래서이 'after_update'트리거에서 무엇을 변경해야합니다. 그러면 새 레코드를 삽입 할 때 감사 테이블에서 '새 레코드'를 읽는 'audit_action'이 있습니까?
.... –