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.*)
觸發返回加入,顯然包括表的所有列,甚至包括那些沒有改變。
是否可以過濾出未更改的列,從而僅返回實際已更改的列?
如果我是你的SELECT語句中的邏輯似乎有缺陷米讀得對。看起來,如果插入了一行,它將不會存在於_deleted_中,並且會被連接濾除;如果一行被更新,它將存在於_inserted_和_deleted_中,但將被存在謂詞從集合中移除;如果一行被刪除,它將不會存在於_inserted_中,並且會被連接過濾掉。所以select不能返回任何行? – jpw 2014-11-02 11:26:47
在任何情況下,您都可以使用[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
@jpw這些函數只會告訴你列是否是SET列表的一部分。他們不會告訴你列值實際上是否因此而改變。 – 2014-11-03 06:00:39