我有一个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
答案 0 :(得分:1)
SQL是否支持嵌套更新触发器?!
是。
当触发器执行操作时,嵌套DML和DDL触发器 启动另一个触发器。这些行动可以启动其他行动 触发器,等等。 DML和DDL触发器最多可以嵌套32个 水平。您可以控制是否可以嵌套AFTER触发器 嵌套触发器服务器配置选项。 INSTEAD OF触发器 (只有DML触发器可以是INSTEAD OF触发器)可以嵌套 无论这个设置如何。
有嵌套触发器和递归触发器。
ALTER DATABASE AdventureWorks2012
SET RECURSIVE_TRIGGERS ON;
GO
[请注意@ marc_s的评论。]我强烈建议你不要在触发器中使用游标,并确保你的触发器可以处理多行。