日期:2014-05-17  浏览次数:20530 次

请问【INSTEAD OF UPDATE】触发器对不感兴趣的列更新,如何让其通过
SQL 2008 R2

想在update A表中的列 col 前进行一些操作,如果是更新其它列,无所谓,放行。

所以我定义了一个INSTEAD OF UPDATE触发器。由于我只对col的更新感兴趣,所以触发器的开头我就判断IF UPDATE(col),代码片段如下:

IF UPDATE(col)
   BEGIN
     --DoSomething;
   END

但这样一来,更新col列时的确会DoSomething,但更新其它列的话就什么都不干,列不会被更新,试过 IF NOT UPDATE(col) RETURN,但与之前的效果一样,一跳就彻底跳出,不再继续。请问有什么语句能实现跳出该触发器并继续?
注:不能用after触发器
------最佳解决方案--------------------

if update(col1) or update(col2) or ...
begin
  do sth.
end

------其他解决方案--------------------
如果你用instead of update的话,相当于你不用系统提供的更新,而用你自己的语句。
这样的话,如果你想更新其他列,那就要像你更新col一样,要给每个列都加上
if update(col2)
begin
 update table set col2=i.col2
 from table a
 inner join inserted i
 on a.id=b.id
end
------其他解决方案--------------------
IF UPDATE(COL)
BEGIN
  DO
END
ELSE
BEGIN
UPDATE T SET COL1=I.COL1,COL2=I.COL2.......... FROM TB T ,INSERTED I WHERE T.ID=I.ID
END
------其他解决方案--------------------
引用:
SQL code


if update(col1) or update(col2) or ...
begin
  do sth.
end


自己按这种方式去组合你的条件,可以是or 。and 什么的。
------其他解决方案--------------------
请问有没有办法在INSTEAD OF中获取到触发它的语句?
------其他解决方案--------------------
引用:
请问有没有办法在INSTEAD OF中获取到触发它的语句?



触发器不是有inserted和deleted临时表吗?
------其他解决方案--------------------
看来想偷懒只有动态exec罢了,一串if update(xxx) or太不符合偷懒原则。NND就不能整个return/continue/skip之类的关键字跳出并继续么