2014-09-05 151 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