在INSERT / UPDATE / DELETE触发器中动态构建UPDATE语句

时间:2014-09-05 08:58:56

标签: sql-server triggers audit-trail

基本上我正在寻找逻辑来从触发器生成字符串变量中的insert或update语句。假设人们刚刚更新N' N'像update语句那样的字段....然后我的触发器将触发并从​​该触发器我想要构建用户发出的更新语句并存储在字符串变量中

我也想从触发器构建插入语句,但我没有得到逻辑。所以,如果有任何想法或示例代码,请与我分享,以实现我的目标。

ALTER TRIGGER WSContent AFTER INSERT, UPDATE, DELETE
AS

SET NOCOUNT ON;

DECLARE @Action VARCHAR(10)
DECLARE @PKValue INT
DECLARE @TableName VARCHAR(50)

SET @TableName='website_content'

IF EXISTS(SELECT * FROM INSERTED)
BEGIN
  IF EXISTS(SELECT * FROM DELETED)
  BEGIN
     SET @Action ='U';
     SELECT @PKValue=ContentNumber from DELETED
  END
  ELSE
  BEGIN
     SET @Action ='I';
     SELECT @PKValue=ContentNumber from INSERTED
  END
END
ELSE
BEGIN
  SET @Action = 'D';
  SELECT @PKValue=ContentNumber from DELETED
END;

INSERT INTO [ContentChangeLog]([PkValue],[TableName],[Action],ActionDate)
VALUES(@PKValue,@TableName,@Action,GetDate())

SET NOCOUNT OFF;

1 个答案:

答案 0 :(得分:1)

与许多人一样,你误解了触发器的工作原理。当您插入,更新或删除多个记录时,触发器被调用一次,删除/插入的表可以包含多个记录,而不是每个记录受影响的记录。假设您在这些表中有多条记录,则需要重写此内容。

INSERT INTO [ContentChangeLog]([PkValue],[TableName],[Action],ActionDate)
SELECT ContentNumber, @TableName, 'I', GETDATE()
FROM INSERTED i
WHERE not exists(SELECT TOP 1 1 FROM DELETED WHERE ContentNumber = i.ContentNumber)

以下是仅插入记录的示例,您需要为更新和删除执行类似的操作。