2015-03-03 69 views
0

這似乎是一個非常愚蠢的問題,但我無法在網上找到任何信息如何做到這一點。INSTEAD OF UPDATE觸發器正在執行標準更新

如果您正在設計一個將包裝Update操作的觸發器,那麼您如何實際執行該操作?我是否必須明確提及tbl_MyTable中的每一列來執行更新?對於未來潛在的模式更改,這似乎對維護密集得多,我不希望在啓用遞歸時不必要地觸發InsertDelete觸發器。

CREATE TRIGGER [dbo].[tr_MyUpdateTrigger] 
ON [dbo].[tbl_MyTable] 
INSTEAD OF UPDATE 
AS 
BEGIN 
--Do the standard update operation on tbl_MyTable that this trigger is replacing 
END 

總之,你怎麼能完成的更新,而不訴諸刪除從刪除,並從插入插入,或直接在您的表中提及的每一列。這甚至有可能嗎?

回答

0

因爲您使用的是INSTEAD OF trigger您必須執行UPDATE - 不能繞過它。如果您要使用AFTER觸發器,則根本不需要執行UPDATE。您應該使用哪種類型的觸發器取決於您試圖實現的目標。

爲了澄清一件事,你不要從'deleted'僞表中刪除並插入'inserted'僞表。你在真正的表上執行UPDATE,並在適當的鍵上加入「插入的」僞表以獲得新的值。

如果我不得不這樣做。我可能會使用這樣的事情來拯救我打字太多了:)

select N't.' + quotename(name) + N' = i.' + quotename(name) + N', ' as [--SQL] 
from sys.columns 
where object_id = object_id('dbo.MyTable') 
order by column_id 

不要忘記刪除的PK列和任何其它不恰當的列(即時間戳)從生成的列表中。

+1

如果有人更新主鍵,插入將無法加入,因此爲什麼我認爲你不得不根據刪除的psudo從你的真實表中刪除,並基於插入插入。但我並不特別想因爲遞歸而這樣做。 – Izzy 2015-03-03 10:15:16

+0

好點!不過,我更多地將這看作是一個設計問題 - 圍繞主鍵進行更新還有很多其他問題。您可以使用[UPDATE()](https://msdn.microsoft.com/zh-CN/library/ms187326.aspx)函數來測試主鍵列是否已更新並拒絕更新。 – 2015-03-03 10:20:49

+0

對啊,所以我可以將PK的更新視爲刪除+插入,這是有道理的。對於所有不涉及PK更新的內容,只需基於插入更新...是否仍然需要明確提及tbl_MyTable中的每一列? – Izzy 2015-03-03 10:30:55

相關問題