本节将阐述与工作流应用程序中使用的 Microsoft® SQL Server™ 数据库相关的问题,其中包括关于表、视图以及其他数据库对象的问题。如果您正在现有数据库上创建工作流应用程序或创建新数据库,建议您查阅此处包含的信息。
架构要求和限制
在设计项目数据库的架构时,考虑下列问题十分重要。
- 要启用用户表的行级权限,此表必须包含整数主键列或标识列。将整数标识列用作主键。这是对主表和明细表的要求,并且是针对所有表的一般性建议。如果表中不包含这样的列,应在启用行级权限之前添加标识列。
- 如果您使用的 SQL Server 的版本低于 SQL Server 2000,则不能复制包含时间戳列的表。
- 不能复制包含大于 6000 个字节的列的表。
- 启用工作流的数据库中的 Nvarchar 列不可超过 2000 个字节。
- modSystem 数据库有一个保留名称。modSystem 数据库中的表以及启用工作流的数据库中的工作流设计器表具有保留名称 — 例如,"modObjects" 和 "modColumns"。不要在项目中任何其他位置使用这些名称。
- 默认情况下,客户机上复制的目标数据库与源数据库同名。如果客户机上的现有数据库已使用默认名称,就赋予目标数据库一个自动生成的名称。新名称存储在 modSystem 数据库的 modApplications 表中。复制过程中不能重命名数据库。
视图和存储过程
为主表或明细表创建数据访问页时,总是将控件绑定到基本视图(或者是在基本视图顶部创建的视图) — 而不是表本身。您必须为基于视图的数据访问页指定一个唯一的表,以使该表可得以更新,并使 Office Developer 工作流工具栏控件能够生效。
向表层次结构添加表时,为每个用户表创建视图。例如,问题跟踪示例中的 Issues 表中包含下列相关视图和存储过程。
- IssuesView 可实施 Issues 表的行级权限和列权限的视图。
- IssuesUpdate 用来返回可更新结果集(包含当前用户具有选择权限的所有列)的存储过程。
要避免的表架构更改
- 向表层次结构添加表之后不要重命名表。
- 不要更改 modStateID 列的名称或数据类型。
- 不要更改启用行级权限的表的标识名称或主键列名称。基于这样的表的触发器和视图按名称引用列。
注意 您可以更改其他列的名称,但必须确保应用程序中不存在那些列名称的其他依赖项。
非法数据库的修复
从数据库手动移除由工作流设计器内部使用的任何表或修改这些表可能会使应用程序无效并禁用这些工具的功能。如果发生这样的情况,必须将数据库注册为工作流应用程序并重新创建工作流过程。
通过从modSystem 数据库调用 modDropSchema 存储过程,然后在工作流设计器中打开数据库,可以修复非法数据库。如果将数据库注册为启用工作流的数据库,则可以重新创建工作流。
注意 在运行 modDropSchema 存储过程之前,您可能需要保存工作流脚本和工作流表(modWorkflow 和 modWorkflowActions),并在修复工作流应用程序之后用它们来重新创建工作流过程。
注意 要备份脚本,可复制“代码编辑器”的全部内容,并将其粘贴到文本编辑器(如 Microsoft® 记事本)中。
注意 要备份表,可将它们导出到另一个 SQL 数据库。尽管您不能直接将这些表导入以重新创建工作流,但可以将它们作为帮助您记住状态和事件的指南。
工作流应用程序用户目录的同步
用来同步工作流应用程序用户目录的计算机上必须有文件 SQLNS.dll,它是和 SQL Server 一起安装,并在计算机中注册的。
若要解决该问题,请在安装了 SQL Server 的计算机上执行所有的同步调度。
.mdf 文件和分离数据库
每个 SQL Server 数据库都和一个 .mdf 文件关联。例如,问题跟踪示例数据库包含文件 IssueTracking_Data.mdf。当您分离数据库时,SQL Server 删除相应的 .mdf 文件。
如果在不首先分离数据库的情况下重新安装 SQL Server,则可能出现问题。重新安装时,SQL Server 移除数据库,但不移除 .mdf 文件。当工作流设计器遇到未附加到 SQL Server 的 .mdf 文件时,许多功能可能会失败。如果在安装工作流设计器组件、在设计器中打开数据库或执行与数据库相关的其他操作时遇到问题,请验证 .mdf 文件是否存在且是否已连接到 SQL Server。
要解决这些问题,可以删除 .mdf 文件,也可以将这些文件附加到 SQL Server。有关详细信息,请参阅 SQL Server Book Online 中的 "Attaching and Detaching Databases"。
用新名称恢复数据库
如果您删除启用工作流的数据库,然后从备份中恢复那个数据库,但却赋予此数据库一个不同的名称,则基于那个数据库的工作流应用程序将不再运行。例如,ProjectA 是数据库 "ProjectA" 上的注册工作流应用程序。用户制作此数据库的备份,然后删除初始 "ProjectA" 数据库。以后,用户恢复数据库,但将其重新命名为 "SolutionA"。
有多个元素必须用新数据库名称进行更新,以便使应用程序再次运行。数据库开发人员应熟悉其中的大多数元素。首先,必须用数据库的新名称更新任何用户界面元素(如包含连接信息的窗体或数据页)。另外,必须更新工作流所特有的一些基础结构,尤其是 modApplication 表。
SQL Server 工作流管理器使用 modSystem 数据库的 modApplications 表中的项跟踪服务器上的所有工作流应用程序。每个应用程序都将其名称以及相关数据库的名称存储在启用工作流的数据库中的本地 modApplication 表中。工作流管理器以编程方式使本地 modApplication 表和 modSystem modApplications 表进行同步。当用户恢复数据库并赋予其一个新名称时,本地 modApplication 表中的数据库名称项不会自动更新,因此这些项变得不能同步。因此,当工作流管理器连接到服务器并显示应用程序的名称时,它仍然显示 "ProjectA" — 尽管并不存在具有那个名称的数据库。因为 modApplication 表中的名称与实际数据库的名称不相匹配,所以工作流应用程序不能运行。
要更正数据库名称项,必须更新 "SolutionA" 数据库中的本地 modApplication 表。尽管不建议手动更改工作流系统表,但在这种情况下,必需使应用程序象期望的那样运行。
更新本地 modApplication 数据库名称列
- 启动“SQL Server 企业管理器”。
- 展开“企业管理器”中的节点,直到可以看到您的数据库。
- 选择恢复的数据库 "SolutionA"。
- 展开“表”节点,显示所有数据库表。
- 用鼠标右键单击 modApplication 表,指向“打开表”,并单击“返回所有行”。
- 用已恢复的数据库名称 "SolutionA" 更新“数据库”列。
下次打开“工作流管理器”并单击“刷新”时,将会看到与此数据库匹配的名称。
解决方案资源管理器没有刷新
在工作流设计器中,当您向应用程序添加新的主表时,解决方案资源管理器可能不会自动刷新。即使按 F5 键手动刷新,也不可能刷新窗口。
要解决此问题,关闭并重新打开解决方案资源管理器以更新此窗口。 |