【问题标题】:"Maximum allowed trigger depth" in SQL Server?SQL Server 中的“最大允许触发深度”?
【发布时间】:2009-10-26 16:27:36
【问题描述】:

我知道“允许触发器触发其他人”服务器设置,它允许触发器执行的操作触发另一个触发器(或不触发),据我所知,我唯一的选项是 True(允许触发器触发其他触发器, 这可能导致无休止的递归)或 False(触发器采取的操作不会触发任何其他触发器,这可能会导致意外结果或不一致的数据)。

有没有办法在 SQL Server 中强制执行“最大触发深度”?如果重要的话,我正在使用 2008,尽管我不知道任何版本(或任何其他 RDBMS 中的功能,尽管我的知识是有限的)。例如,这就是我想要的:

  1. 将“最大触发深度”设置为“2”。
  2. 我在 table1 中插入一行
  3. table1 上的触发器插入到 table2 中
  4. table2 上的触发器插入到 table3 中
  5. table3 上有一个触发器会插入到 table4 中,但由于最大深度为 2,因此触发器不会运行(不太理想,但与 SQL Server 上当前的“递归触发器 = False”行为一致) ,或者整个插入集被回滚并失败,并出现类似“最大触发深度 (2) 超出 - 插入失败”消息(理想)的错误消息(理想)

是否有人知道这是否可能,或者是否有针对此行为的出色功能请求?如果我疯了并且这是一个糟糕的行为想法,我对此持开放态度,但我想知道原因(意外后果等)。

【问题讨论】:

    标签: sql-server triggers data-consistency


    【解决方案1】:

    在触发器内部,您可以检查嵌套级别,并可选择返回:

    IF (TRIGGER_NESTLEVEL() > 2)
        RETURN
    

    查看blog post了解更多详情。

    【讨论】:

    • exec sp_CONFIGURE 'nested_triggers' 只能取值 0 或 1。
    • 那篇博文正是我想要的——谢谢。我不敢相信我不知道这个功能
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多