2013-12-21 81 views
0

我有一个后插入/更新触发器。它应该从插入的记录中获得一个字段值(让我们称之为“CurrentState”)。检查另一个表中的CurrentState值,然后为该字段查找另一个值,然后使用该值更新新添加或更新的记录。所以在记录更新之后,当前状态可能会更新多次。 SQL是否支持嵌套更新触发器?实际上它现在不起作用,我没有在我的代码中发现任何错误。所以我对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 
+0

http://technet.microsoft.com/en-us/library/ms190739.aspx –

+1

你假设这个触发器是每行调用一次** - 这是** NOT **酪蛋白SQL Server 。该触发器在每个语句**中调用**一次,如果该语句插入或更新多行,则“插入”将包含多行,而您从选择的“select @CurrentState = CurrentState”会任意选择其中一行并忽略所有其他)。另外:在触发器内部有一个**光标**是关于从性能角度来看可以做的最差的事情! –

+0

假设你的'sql'(这只是结构化的查询语言 - 没有更多),但你真的可能意味着'sql-server'(Microsoft关系数据库产品) - 正确吗?相应更新您的标签 –

回答

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的评论]我强烈建议你不要在触发器中使用游标,并确保您的触发器能够处理多行。

+0

谢谢。 “SET RECURSIVE_TRIGGERS ON”这正是我所需要的。现在我的触发器运作良好。 –