0

我有一个相当大的 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

这个简单的脚本适用于我的情况。我只是想向社区展示它,以了解这种方法的任何优点或缺点。

4

1 回答 1

0

这样做没有问题。事实上,AppFabric 有一个菜单选项正是为此目的。我从未检查过,但我认为它执行 PowerShell 命令,大多数菜单选项都执行,并且您可以使用 PS 命令执行相同的操作。

于 2012-01-24T18:07:22.620 回答