SQL Server触发器未正确触发

时间:2010-11-24 22:11:02

标签: sql-server database

我有一个触发器,我认为只有当其中一个列更新而不是表时才会更新。有没有办法重写这个,所以只有当指定的列更新而不是表中的其他字段

时才会触发
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

3 个答案:

答案 0 :(得分:1)

不,触发器被定义为 FOR UPDATE ON [afm]。[rm] ,因此它将始终为该表上的每次更新触发。没有办法预先限制它。

你在触发器内的检查将消除实际做任何事情的任何“多余”触发器激活。

答案 1 :(得分: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

答案 2 :(得分:0)

UPDATE()仅表示该列包含在数据集中。它没有表明底层数据是否不同。

你必须要比这更复杂。

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

查看this link了解更多信息。