【发布时间】: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