【问题标题】:How to have nested trigger in sql?如何在sql中有嵌套触发器?
【发布时间】:2013-12-21 11:52:32
【问题描述】:

我有一个 After insert/update 触发器。它应该从插入的记录中获取一个字段值(我们称之为“CurrentState”)。检查另一个表中的 CurrentState 值,然后为该字段找到另一个值,然后使用该值更新新添加或更新的记录。所以在记录更新后,当前状态可能会更新几次。 SQL 是否支持嵌套更新触发器?!实际上它现在不起作用,我没有在我的代码中发现任何错误。所以我开始怀疑 sql 支持。

这是我的代码

create  TRIGGER [dbo].[ASI_trigBPMIAutomaticState]
   ON  [dbo].[ASI_TblBPMForm]
   AFTER INSERT, Update
AS 
BEGIN

    select @CurrentState  = CurrentState from inserted;
    select @FormID = FormID from inserted;

    DECLARE curflow CURSOR 
    LOCAL SCROLL STATIC
    for select w.WorkflowID
    from ASI_TblBPMWorkflow w
    where  w.FromState = @CurrentState

    OPEN curflow

    FETCH first FROM curflow
    INTO @WorkflowID            
    WHILE @@FETCH_STATUS = 0
    BEGIN       
        select @ToState = StateID
        from TblStates
        where r.ResponseID = @WorkflowID

        if (@ToState  =1)
            breake;

        FETCH next FROM curflow
        INTO @WorkflowID
    END -- While Cursor

    CLOSE curflow
    DEALLOCATE curflow  

    if (@QID > 0)   
    begin   
        update ASI_TblBPMForm
        set CurrentState = @ToState
        where FormID = @FormID
    end;
end

【问题讨论】:

  • 您假设此触发器每行调用一次 - 这不是 SQL Server 中的casein。 每个语句调用一次触发器,如果该语句插入或更新多行,则Inserted 将包含多行,而您的select @CurrentState = CurrentState from inserted; 将任意选择其中一行(并忽略所有其他)。另外:从性能的角度来看,在触发器中包含 光标 是关于您可以做的 WORST 事情!
  • 假设您使用了sql(这只是结构化查询语言-仅此而已),但您的意思可能是sql-server(Microsoft 关系数据库产品)-对吗?相应地更新了您的标签

标签: c# sql .net sql-server triggers


【解决方案1】:

SQL 是否支持嵌套更新触发器?!

是的。

Create Nested Triggers

当触发器执行操作时,DML 和 DDL 触发器都是嵌套的 启动另一个触发器。这些动作可以启动其他 触发器等等。 DML 和 DDL 触发器最多可嵌套 32 个 水平。可以通过控制AFTER触发器是否可以嵌套 嵌套触发器服务器配置选项。 INSTEAD OF 触发器 (只有 DML 触发器可以是 INSTEAD OF 触发器)可以嵌套 无论此设置如何。

有嵌套触发器和递归触发器。

ALTER DATABASE AdventureWorks2012
   SET RECURSIVE_TRIGGERS ON;
GO

[请注意@marc_s 的 cmets。] 我强烈建议您不要在触发器中使用游标,并确保您的触发器可以处理多行。

【讨论】:

  • 谢谢。 “ SET RECURSIVE_TRIGGERS ON” 这正是我所需要的。现在我的触发器运行良好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 2014-06-07
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 2010-12-08
相关资源
最近更新 更多