我有一个相当大的 Windows 工作流实现,有时我必须更新工作流。我们时不时会遇到工作流定义被破坏的情况,因此会引发 IndexOutOfRangeException。如果 WF 允许您使用 Terminate() 或 Abort() 方法终止工作流,这将不是问题。
我知道有两种解决方案。第一个涉及使用 Microsoft 编写的 .SQL 脚本删除和添加工作流表。另一种是修改定义并将其保存回 percistant 表 - 这是一项非常繁琐的任务,不建议胆小的人使用。
我想知道是否存在人们害怕考虑的第三种选择 -从 dbo.InstanceState 和 dbo.WorkflowInstance 表中删除记录。 下面是一个可以解决问题的脚本:
DECLARE @WorkflowInstancID uniqueidentifier
-- SET @WorkflowInstancID = <Your friendly, offending Workflow Instance ID>
DELETE FROM dbo.WorkflowInstanceEvent
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.UserEvent
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.ActivityInstance
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.ActivityExecutionStatusEvent
WHERE WorkflowInstanceInternalId IN (SELECT WorkflowInstanceInternalId FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID)
DELETE FROM dbo.InstanceState WHERE uidInstanceID = @WorkflowInstancID
DELETE FROM dbo.WorkflowInstance WHERE WorkflowInstanceId = @WorkflowInstancID
GO
这个简单的脚本适用于我的情况。我只是想向社区展示它,以了解这种方法的任何优点或缺点。