2010-11-24 72 views
2

我有一個觸發器,我認爲只有在其中一列被更新時纔會更新,而不是表格。有沒有辦法改寫這個所以它只火災時,指定的列SQL Server觸發器沒有正常觸發

CREATE TRIGGER [afm].[afm_rm_dwgs_t] ON [afm].[rm] 
    FOR UPDATE 
AS 
    IF (UPDATE(area) OR UPDATE(dv_id) 
    OR UPDATE(dp_id) OR UPDATE(rm_cat) 
    OR UPDATE(rm_type) OR UPDATE(rm_std)) 
    BEGIN 
     SET NOCOUNT ON; 
     UPDATE afm.afm_dwgs 
     SET dwg_updt = 1 
     WHERE afm_dwgs.dwg_name IN (SELECT dwgname FROM inserted) 
    END 

回答

1

否,觸發被定義爲FOR UPDATE ON [AFM]表內更新不是等領域。[RM],所以它會隨時爲該表上的每個更新啓動。沒有辦法限制這種前期。

您在觸發器內的檢查將消除實際做任何事情時的任何「多餘」觸發激活。

1

假設要檢查區域列被更新,那麼代碼會是這樣的:

declare @oldArea varchar(50) 
declare @newArea varchar(50) 

select @oldArea= area from deleted 
select @newArea=area from inserted 

if (@oldArea <> @newArea) 
-- area is updated 
+0

或只是`if(UPDATE([FieldName]))`? – bevacqua 2010-11-24 22:18:40

0

UPDATE()只意味着列被列入數據集。它沒有表示底層數據是否不同。

你必須比這更復雜一點。

您需要比較DELETED和INSERTED值,以查看是否有更改。

檢查this link瞭解更多信息。