2010-11-24 31 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了解更多信息。