Sql server 在INSERT/UPDATE/DELETE触发器中动态生成UPDATE语句

Sql server 在INSERT/UPDATE/DELETE触发器中动态生成UPDATE语句,sql-server,triggers,audit-trail,Sql Server,Triggers,Audit Trail,基本上,我在寻找从触发器在字符串变量中生成insert或update语句的逻辑。假设人们只更新“N”个字段,比如updatestatement…,那么我的触发器将触发,从该触发器中我希望生成用户发出的update语句,并将其存储在字符串变量中 我也想用同样的方法从触发器构建insert语句,但我得不到逻辑。因此,如果有人有任何想法或示例代码,请与我分享,以实现我的目标 ALTER TRIGGER WSContent AFTER INSERT, UPDATE, DELETE AS SET NOC

基本上,我在寻找从触发器在字符串变量中生成insert或update语句的逻辑。假设人们只更新“N”个字段,比如updatestatement…,那么我的触发器将触发,从该触发器中我希望生成用户发出的update语句,并将其存储在字符串变量中

我也想用同样的方法从触发器构建insert语句,但我得不到逻辑。因此,如果有人有任何想法或示例代码,请与我分享,以实现我的目标

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;

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

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)

这里只是一个插入记录的示例,您将希望对更新和删除执行类似的操作。

您不会误解我的要求。根据我的场景,只会更新或插入一条记录。我喜欢从触发器动态构建insert&update语句。假设我的表中有100列,但只更新了2列,那么我的触发器将触发。因此,从触发器中,我喜欢生成update语句,比如updatemytable_name SET col1='value1',col2='value2',其中id=10类似于这样。如果仍然不清楚我的要求,请让我知道。感谢您在varchar变量中构建SQL,然后使用以下内容执行它:sp_executesql良好审计跟踪脚本