2014-11-02 138 views
0

更新的列我有以下觸發:SQL服務器獲得的觸發

ALTER trigger [dbo].[tr_test] 
ON [dbo].[customers] 
for insert, update, delete 
as 
    IF (@@ROWCOUNT = 0) return 
    SET NOCOUNT ON 

    SELECT * 
    FROM INSERTED I JOIN DELETED D 
    ON I.id_no = D.id_no 
     AND EXISTS (SELECT I.* 
        EXCEPT 
        SELECT D.*) 

觸發返回加入,顯然包括表的所有列,甚至包括那些沒有改變。

是否可以過濾出未更改的列,從而僅返回實際已更改的列?

+0

如果我是你的SELECT語句中的邏輯似乎有缺陷米讀得對。看起來,如果插入了一行,它將不會存在於_deleted_中,並且會被連接濾除;如果一行被更新,它將存在於_inserted_和_deleted_中,但將被存在謂詞從集合中移除;如果一行被刪除,它將不會存在於_inserted_中,並且會被連接過濾掉。所以select不能返回任何行? – jpw 2014-11-02 11:26:47

+0

在任何情況下,您都可以使用[UPDATED()](http://msdn.microsoft.com/zh-cn/library/ms187326.aspx)和[COLUMNS_UPDATED()](http://msdn.microsoft.com/ en-us/library/ms186329.aspx)來檢查一個或多個(在後一種情況下)列是否發生了變化。據我所知,你不能得到改變列的列表,所以你必須測試你感興趣的每一列。但是我關於觸發器的知識有點有限。 – jpw 2014-11-02 11:38:24

+0

@jpw這些函數只會告訴你列是否是SET列表的一部分。他們不會告訴你列值實際上是否因此而改變。 – 2014-11-03 06:00:39

回答

-1

嘗試像這個 -

CREATE trigger [dbo].[tr_test] 
 
ON [dbo].[Grades] 
 
for insert, update, delete 
 
as 
 
    IF (@@ROWCOUNT = 0) return 
 
    SET NOCOUNT ON 
 
    
 
create tablae #inserted (...) 
 
    insert into #inserted 
 
    SELECT * 
 
    from INSERTED 
 
create tablae #deleted (...) 
 
    insert into #deleted 
 
    SELECT * 
 
    from deleted 
 

然後使用這個腳本

SELECT * 
 
     FROM #inserted 
 
     WHERE NOT EXISTS (SELECT * from #deleted)

+0

我想知道爲什麼這個答案無用 – 2014-11-02 15:42:47

+0

該觸發器沒有返回記錄 – 2014-11-03 06:53:53