2014-09-05 149 views
0

基本上我找的逻辑来生成触发字符串变量插入或更新语句。假设当人们刚刚更新一样update语句领域的“N” ......然后我的触发条件会,并从触发,我想建立什么更新语句是由用户和存储在字符串变量发出动态生成UPDATE语句INSERT/UPDATE内/ DELETE触发

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

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; 
+0

良好的审计线索脚本http://stackoverflow.com/questions/15941881/sql-server-auto-audit-updated-column – Thomas 2014-09-08 14:54:48

回答

1

像许多人一样,你误解了触发器的工作原理。当您插入,更新或删除多条记录,触发被调用一次和表中删除/插入可以包含多个记录,而不是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) 

这是一个插入记录的例子,你会想要为你的更新和删除做类似的事情。

+0

没有你误解我的要求。根据我的情况,只有一条记录会被更新或插入。我喜欢从触发器动态构建插入和更新语句。比如说我有100列的表格,但只有2列更新,然后我的触发器会触发。所以从触发我喜欢生成更新语句,如更新mytable_name SET col1 ='value1',col2 ='value2'其中id = 10这样的事情。如果仍然不清楚我的要求,请让我知道。谢谢 – Thomas 2014-09-05 14:55:16

+0

在一个varchar变量中构建你的SQL,然后用类似下面的方法执行它:sp_executesql http://msdn.microsoft.com/en-us/library/ms188001.aspx – Steve 2014-09-05 18:58:03