如何在sql中嵌套触发器?

时间:2013-12-21 11:52:32

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

我有一个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

1 个答案:

答案 0 :(得分: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的评论。]我强烈建议你不要在触发器中使用游标,并确保你的触发器可以处理多行。