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

  • 问题

  • 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,但与之前的效果一样,一跳就彻底跳出,不再继续。请问有什么语句能实现跳出该触发器并继续?

    2012年8月24日 4:13

答案

  • AFTER 中可以 ROLLBACK 的, 执行 ROLLBACK 语句,就会 ROLLBACK 触发触发器的操作

    • 已标记为答案 ahdung_AI 2012年8月25日 0:52
    2012年8月24日 5:22
  • 至于用 INSTEAD OF 的话, 你照样可以通过访问 inserted 和 deleted 两张逻辑表来得到对该表的那些记录做变更
    • 已标记为答案 ahdung_AI 2012年8月25日 0:52
    2012年8月24日 5:24
  • 另外, 你也可以考虑用 after 触发器, 只是如果更新了 col 的话, 你在触发器里面 join deleted 这张逻辑表把值更新回去不就成了?

    当然, 个人不推荐这样的操作, 直接拒绝权限会更明确, 否则时间一长, 遇到人员变换一下, 这种比较怪异的处理可能会让人头痛的

    • 已标记为答案 ahdung_AI 2012年8月25日 0:52
    2012年8月24日 7:49

全部回复

  • 你应该用 ater update, 在更新喉舌之后去做

    2012年8月24日 4:18
  • INSTEAD OF指定执行 DML 触发器而不是触发 SQL 语句

    也就是说, 引用触发器的SQL 语句不会被实际执行, 你需要自己在触发器中去实现

    2012年8月24日 4:28
  • 有想过,但DoSomething中有判断,只有当满足一定条件时才允许更新col,如果after的话,判断就得改为若不满足一定条件,就把col改回以前的样子,变相实现不允许更新col的效果,这样很别扭。况且如果业务逻辑严格要求:若不满足条件则【绝对】不允许更新col的话,after就更是不能考虑。

    2012年8月24日 4:31
  • 那请问有没有可能在INSTEAD OF触发器中获得触发它的SQL语句?如果能,问题就好办了
    2012年8月24日 4:47
  • AFTER 中可以 ROLLBACK 的, 执行 ROLLBACK 语句,就会 ROLLBACK 触发触发器的操作

    • 已标记为答案 ahdung_AI 2012年8月25日 0:52
    2012年8月24日 5:22
  • 至于用 INSTEAD OF 的话, 你照样可以通过访问 inserted 和 deleted 两张逻辑表来得到对该表的那些记录做变更
    • 已标记为答案 ahdung_AI 2012年8月25日 0:52
    2012年8月24日 5:24
  • 可同时更新若干列的话,我只想rollback某列也不成吧。至于根据两张虚拟表写出剩余的更新语句,列一多就比较蛋疼。要是有个continue/skip之类的关键字能跳过本触发器并继续是多么优雅的事
    2012年8月24日 7:22
  • 那你直接权限上控制不允许改这个列不是更好一些?

    否则的话, 别人明明提交一个 SQL 语句修改了这个列和其他列, 结果一查更新, 某个列没有更新到, 在不知情的情况下, 那不是在头大半天

    2012年8月24日 7:47
  • 另外, 你也可以考虑用 after 触发器, 只是如果更新了 col 的话, 你在触发器里面 join deleted 这张逻辑表把值更新回去不就成了?

    当然, 个人不推荐这样的操作, 直接拒绝权限会更明确, 否则时间一长, 遇到人员变换一下, 这种比较怪异的处理可能会让人头痛的

    • 已标记为答案 ahdung_AI 2012年8月25日 0:52
    2012年8月24日 7:49
  • 关注一下

    给我写信: QQ我:点击这里给我发消息

    2012年8月24日 13:43
  • 关键这个列Col也不是完全不让更新,是有条件的更新,目前我已经改用after触发器,更新后再检测条件,不满足则根据deleted表更新回去,并且抛个错误给应用程序~目前来看,目的达到
    2012年8月25日 0:50