使用“忽略更新”触发器锁定记录?

时间:2018-02-28 20:15:43

标签: sql-server

我有一个类型字段“record_lock”,用户可以自由设置。目的是当record_lock = 0时可以进行更新和删除,并且当record_lock = 1时,它们不能。该表有一个AFTER UPDATE触发器,当使用“IF UPDATE(field)”语句更新不同的字段时触发某些操作,我希望保留这种行为。

如果我要创建一个INSTEAD OF UPDATE触发器,那么它可能看起来像:

UPDATE table
 SET field1=inserted.field1
     ...
     fieldx=inserted.fieldx
 FROM table INNER JOIN inserted ON table.ID=inserted.ID
 WHERE record_lock=0

但是,所有字段将被视为已由AFTER UPDATE触发器更新。我不想要这个。或者,我可以这样做:

IF UPDATE(field1)
 UPDATE table
  SET field1=inserted.field1
  FROM table INNER JOIN inserted ON table.ID=inserter.ID
  WHERE record_lock=0;
...
IF UPDATE(fieldx)
 UPDATE table
  SET fieldx=inserted.fieldx
  FROM table INNER JOIN inserted ON table.ID=inserter.ID
  WHERE record_lock=0;

但随后它会触发多次更新,这些更新也会在更新后发生混乱,效率可能会降低。

我真正想说的是“正常启动更新,但仅适用于record_lock = 0的记录”。我找不到办法做到这一点。它甚至在“INSTEAD OF UPDATE”之前需要一定程度的触发,也许是“IGNORE UPDATE”!

0 个答案:

没有答案