关于数据库项目、生成和部署问题的疑难解答

更新:2007 年 11 月

在创建、修改、生成或部署数据库项目时,可能会遇到以下问题:

  • 创建数据库项目时出错

  • 尝试将 SQL Server 2000 数据库用于设计时验证时出错

  • 数据库对象中的错误

  • 在 Microsoft SQL Server 2005 中使用新保留字

  • 命令行生成中的差异

  • 对称密钥、非对称密钥和证书

  • 依赖项与更新脚本

  • 将自己添加为用户时出错

  • 带引号的标识符可能导致项目重新加载发生错误

  • 数据库的内部状态与其内容不一致

  • 全文搜索

  • SQLCLR 对象

  • 撤消挂起的更改

  • 找不到 Windows NT 用户或组

  • 重复的对象名和排除文件

  • CREATE ASSEMBLY 不支持引用文件

  • 从 SQL Server 2000 转换到 SQL Server 2005 时遇到的问题

  • 数据库限定名称和服务器限定名称

  • 对扩展属性的支持

  • 导入数据库架构的性能

  • 生成错误导航

  • 数据库项目和 TRUSTWORTHY 设置

  • 链接服务器和导入脚本

  • 使用交叉数据库引用时出现语法错误

  • XML 索引具有扩展属性

  • Team Foundation Build 的权限问题

  • 生成过程中出现意外的标记警告

  • 从基于 x64 的计算机到远程数据库服务器的命令行部署失败

创建数据库项目时出错

如果您不具有在用于设计时验证的 Microsoft SQL Server 的本地实例中创建数据库的权限,则创建数据库时就会出现一条错误消息。

说明:

请使用 SQL Server Management Studio 等工具配置对 SQL Server 实例的权限。如果无法使用管理凭据登录,则可能需要要求管理员授予您在 SQL Server 中创建数据库的权限。

必须确保为设计时验证数据库指定的实例名称正确无误。有关更多信息,请参见如何:指定要用于设计时验证的 SQL Server 本地实例

如果在不具有管理权限的情况下运行 Visual Studio,可能会出现错误“在数据库 'master' 中拒绝了 CREATE DATABASE 权限”。若要解决此错误,具有 sysadmin 权限的用户应当对设计时验证数据库运行以下脚本:

USE master
GO
GRANT EXECUTE ON sp_detach_db TO public
GO

尝试将 SQL Server 2000 数据库用于设计时验证时出错

如果将用于设计时验证的数据库更改为 SQL Server 2000 的一个实例,然后尝试创建或修改数据库项目,则会出现一个错误。该错误可能类似:“‘ENABLE BROKER’附近有语法错误”。设计时验证数据库使用 SQL Server 2005 功能。

说明:

必须指定 SQL Server 2005 数据库的一个有效实例作为设计时验证数据库。有关更多信息,请参见如何:指定要用于设计时验证的 SQL Server 本地实例

数据库对象中的错误

当数据库对象中包含一个或多个语法错误时,该数据库的图标就会显示错误图标(红色的“!”),并且“错误列表”窗口中会显示关联的错误消息。此外,还会为设计时验证期间由 SQL Server 的本地实例返回的错误报告正确的行号。但是,报告的列号始终是第一列。对于 SQL 语法错误,行和列都是正确的。

说明:

出现在“错误列表”中的错误消息应提供有关如何解决错误的信息。解决错误并保存数据库对象后,该数据库对象的图标就会返回到其典型状态。

在 Microsoft SQL Server 2005 中使用新保留字

下面是 SQL Server 2005 中的新保留字:EXTERNAL、PIVOT、REVERT、TABLESAMPLE 和 UNPIVOT。如果将这些保留字用作目标为 SQL Server 2000 的数据库项目中的架构对象名称,则“输出”窗口中会出现一个错误。

说明:

若要解决这个限制,可将架构对象名称放在引号中。例如,您可以使用 "CREATE TABLE [External] (c1 INT)"。

命令行生成中的差异

如果在 Visual Studio 中打开项目时执行命令行生成,则无法接收在用户界面中进行生成时可接收的全部生成错误。

说明:

若要解决这个问题,请在执行命令行生成前在 Visual Studio 中关闭数据库项目。

对称密钥、非对称密钥和证书

在 Visual Studio Team System Database Edition 中,不能创建对称密钥、非对称密钥或证书作为数据库对象。导入数据库架构时,占位符注释将与密钥和证书名称一起放入预先部署脚本中。若要创建这些对象,必须更改预先部署脚本。同样,比较数据库架构时,架构更新脚本中不包含创建缺失的对称密钥、非对称密钥或证书所需的 Transact-SQL (T-SQL) 命令。您必须将这些更新脚本导出到编辑器并添加语句才能创建这些对象。

依赖项与更新脚本

为了在更新脚本中生成正确的对象顺序,架构比较会检查对象依赖项。例如,如果视图依赖于表,则该表必须先于视图创建。如果依赖于其他对象的对象不使用架构限定的名称,则可能无法标识依赖项,更新或创建脚本中语句的顺序可能不正确。更新“目标”使其与“源”匹配后者将更改部署到数据库时,这种差异就可能导致错误。数据库生成脚本同样存在这个问题。

说明:

若要解决此问题,请确保对涉及依赖关系的对象的名称进行架构限定。在下面的示例中,如果将语句结尾更改为引用 [dbo].[KeysTable] 而不仅仅是 KeysTable,就可以保证依赖关系将正确标识:

CREATE VIEW [NewUser].[ViewReferencingScalarFunction] AS SELECT Column2, dbo.SimpleMultiplyParamByTwo(PK_Column) AS [Function] FROM KeysTable

将自己添加为用户时出错

如果您是 sysadmin 角色的成员并尝试将自己添加为用户,则会显示如下错误:“该登录已用另一个用户名开立帐户。”此错误出现的原因是您是设计时验证数据库的数据库所有者,这意味着您也是该数据库的用户 dbo。因此,您不能将自己再添加为数据库用户。

带引号的标识符可能导致项目重新加载发生错误

如果在数据库属性中清除了“SET QUOTED_IDENTIFIER”复选框,则在保存对象或加载包含带引号的标识符的数据库时将出现此错误。如果从使用了带引号的标识符的数据库导入数据库架构,则会出现这种情况。

说明:

若要解决此问题,可以使用两种方法。可以修改对象定义,用方括号代替引号。例如,可以将 "My Table" 更改为 [My Table]。也可以打开“项目”菜单,单击“数据库项目 属性”,再单击“数据库属性”选项卡,选中“SET QUOTED_IDENTIFIER”复选框。

数据库的内部状态与其内容不一致

使用 Database Edition 时可能会收到以下错误:“数据库项目的内部状态与其内容不一致。您必须卸载该项目并重新加载才能解决这个问题。”此错误说明,维护认为其中包含的文件的列表的项目不再与文件状态同步。遇到此问题的最常见原因是在未打开数据库项目时从磁盘中删除了项目中的某个文件。如果导入数据库架构时出现问题,则也可能导致该错误。

说明:

若要解决此问题,必须卸载并重新加载数据库项目。为此,请在“解决方案资源管理器”中单击该项目。打开“项目”菜单,然后单击“卸载项目”。卸载项目后,打开“项目”菜单,然后单击“重新加载项目”。

全文搜索

全文搜索和设计时验证数据库

如果在设计时验证数据库中关闭全文搜索并从具有全文索引对象的数据库中导入架构,则会导入这些对象。但是,“错误列表”窗口中会为使用全文索引的所有对象显示错误。如果导入对象后在设计时验证数据库中关闭全文搜索,会出现相同的错误。

说明:

若要解决该问题,必须在设计时验证数据库中打开全文搜索。有关更多信息,请参见 Microsoft 网站 上的“全文搜索”。

全文索引定义中的 sp_fulltext_table 操作

在全文索引的定义中只允许使用 CREATE 操作。如果要执行诸如 ACTIVATE 之类的操作,则必须在数据库的后期部署脚本中执行它。如果您添加其他操作,则将出现以下错误:主批处理不能具有顶级数据操作语言(DML)语句。请移除该语句,然后重试操作。

说明:

若要解决此问题,必须将 sp_fulltext_table 语句移到后期部署脚本或后期部署脚本所包括的脚本中。有关后期部署脚本的更多信息,请参见如何:指定预先部署或后期部署脚本

SQLCLR 对象

默认情况下,Microsoft SQL Server 2005 中禁用了 SQLCLR 集成。如果从具有 SQLCLR 对象的数据库导入架构,并且设计时验证数据库中禁用了 SQLCLR 集成,则“错误列表”窗口中不会出现错误。但是,如果尝试执行这些对象,就会遇到错误。

说明:

若要解决该问题,必须以系统管理员的身份从 Database Edition 或诸如 SQL Server Management Studio 之类的工具运行 Transact-SQL 编辑器,然后连接到服务器。然后,在查询窗口中执行以下代码:

exec sp_configure 'clr enabled', 1
reconfigure

撤消挂起的更改

在使用版本控制系统的“撤消挂起的更改”命令之后,“架构视图”不会自动刷新。例如,如果对一个表或一列进行了重命名,然后撤销这些更改,则“架构视图”中将出现消息“外部文件更改,需要重新同步...”。

说明:

若要解决此问题,必须在“架构视图”工具栏上单击“同步”。

找不到 Windows NT 用户或组

如果数据库项目引用不可用的登录,则将出现“找不到 Windows NT 用户或组‘DomainName\LoginName’。请再次检查该名称。”错误。例如,如果您所使用的计算机与从中导入架构的数据库不在同一个域中,就有可能会遇到此问题。如果您在家处理从其他地方创建的数据库项目,通常会出现这种情况。在这种情况下,不能生成或部署数据库项目。

说明:

对于此问题没有解决方法。只能在所引用的登录有效的位置生成和部署数据库项目。

重复的对象名和排除文件

如果数据库项目中有重复的对象名称(例如,两个表的名称均为 Orders),则“错误列表”窗口中会出现错误。即使通过排除包含某个重复对象的定义的文件来解决此问题,该错误消息也不会立即消失。

说明:

若要解决此问题,可以单击“刷新”,也可以编辑包含对象定义的文件,重命名该对象,然后保存该文件。

CREATE ASSEMBLY 不支持引用文件

可以使用两种方法向 Transact-SQL (T-SQL) CREATE ASSEMBLY 语句添加 CLR 程序集:将二进制代码包含在该语句中或指定程序集的文件路径。Database Edition 不支持后一种方法。如果您尝试使用此语法,则将出现以下错误:CREATE ASSEMBLY 语句只能在其 FROM 子句中包含二进制元素。

说明:

对于此问题没有解决方法。

从 SQL Server 2000 转换到 SQL Server 2005 时遇到的问题

在将数据库项目从 SQL Server 2000 转换到 SQL Server 2005 时,SQL Server 2005 对象的上下文菜单不出现在“架构视图”中。

说明:

若要解决此问题,请在将数据库项目转换到 SQL Server 2005 之后,关闭并重新打开它。

数据库限定名称和服务器限定名称

在 Team Edition for Database Professionals 中创建对象时,对象将按照 [schema].[object].[child] 命名约定来命名。如果您希望引用其他数据库或其他服务器中的对象,则可以包括以下格式的数据库名称和服务器名称:[server].[database].[schema].[object].[child]。如果所创建的存储过程或视图引用的对象需要使用服务器限定名称或数据库限定名称,则将出现一个警告。

说明:

若要解决此警告,必须定义一个跨数据库引用。有关跨数据库引用的更多信息,请参见跨数据库引用概述如何:创建跨数据库引用

重要说明:

如果项目中包含有关数据库限定名称或服务器限定名称的未解决的警告,而且您在数据库项目属性的“生成”选项卡上选中了“将警告视为错误”复选框,则部署将失败。失败的原因是数据库限定名称或服务器限定名称会生成警告。如果您使用的是数据库限定名称或服务器限定名称,则必须清除“将警告视为错误”复选框。

对扩展属性的支持

本版本的 Database Edition 不支持文件组、文件名和函数约束的扩展属性。如果导入数据库架构或脚本,则将跳过这些类型的对象的扩展属性。

此外,也将跳过存储 TinyInt、SmallInt、UniqueIdentifier 或 bit 值的扩展属性,并将其放入 ScriptsIgnoredOnImport.sql 文件中。

说明:

若要解决此问题,必须在后期部署脚本中手动创建扩展属性。有关更多信息,请参见如何:指定预先部署或后期部署脚本

导入数据库架构的性能

如果在“测试列表编辑器”窗口或“测试视图”窗口处于打开状态时导入数据库架构,则完成导入操作所花的时间将显著增加。无论是在“新建数据库向导”(如果选择了导入数据库架构)中还是在“导入数据库架构”操作过程中,都会出现这种性能下降的情况。即使在导入数据库架构前关闭了“测试列表编辑器”窗口和“测试视图”窗口,也会出现此问题。

说明:

若要解决此问题,必须关闭“测试列表编辑器”窗口和“测试视图”窗口,关闭并重新启动 Visual Studio,然后导入数据库架构。对于较小的架构,可能不需要执行这些步骤。对于 AdventureWorks 示例数据库,在“测试列表编辑器”窗口处于关闭状态时导入架构需花费 27 秒,在“测试列表编辑器”窗口处于打开状态时则需花费 48 秒。

生成错误导航

如果部署失败,则无法通过更新所产生的生成脚本来更正错误。必须更正用于产生该生成脚本的源文件。如果在“错误列表”窗口中双击某一部署错误,则生成脚本将出现在编辑器中,并显示导致此错误的行。

说明:

若要解决此问题,必须查看生成脚本以确定失败的原因,但随后必须修改数据库项目中包含此错误的源文件。例如,如果后期部署脚本 Permissions.sql 包含错误,则必须修改 Permissions.sql 而非生成脚本。

数据库项目和 TRUSTWORTHY 设置

您必须拥有 sysadmin 权限,才能启用数据库项目的 TRUSTWORTHY 设置或打开启用了 TRUSTWORTHY 设置的数据库项目。

说明:

若要解决此问题,在不应该启用 TRUSTWORTHY 设置时,请管理员禁用数据库项目的此设置。在必须启用 TRUSTWORTHY 设置时,必须向使用该数据库项目的所有开发人员授予对该数据库的 sysadmin 权限。如果每位开发人员都在独立开发环境中工作,则每位开发人员都有一个私有的数据库副本,因而可以放心地将其添加到该数据库的 sysadmin 角色。

链接服务器和导入脚本

如果将多个脚本导入到了数据库项目中,则在部署该数据库项目时可能会收到一个错误。如果在这些脚本之间多次定义了同一个链接服务器,则可能会发生这种情况。

说明:

若要解决此问题,可以在 LinkedServers.sql 预先部署脚本中的每个 sp_addlinkedserver 调用前添加以下 T-SQL:

IF NOT EXISTS (SELECT * FROM master.dbo.sysservers WHERE srvname = N'<serverName>')

使用交叉数据库引用时出现语法错误

在保存某个对象定义,而且该对象定义中包含对其他数据库中对象的引用时,可能会收到一个或多个语法错误。例如,可以添加对数据库项目的引用,定义名为 RefServer 和 RefDatabase 的变量并为它们赋值,然后按如下方式定义一个视图:

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM $(RefServer).$(RefDatabase).dbo.TableName

在保存该定义时,可能会收到一条或多条指示语法不正确的错误消息。这些错误消息可能引用设计时验证数据库的名称,这可能会令人混淆。

说明:

若要解决此问题,必须将变量名括在中括号中。若要纠正本示例中的问题,请按如下方式进行更改:

CREATE VIEW [dbo].[MyView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].dbo.TableName

XML 索引具有扩展属性

在保存某个 XML 索引的对象定义,而且该索引中包含一个或多个扩展属性的定义时,可能会出现一个或多个语法错误。之所以会出现这种错误,是因为在放置和重新创建 XML 索引时,SQL Server 2005 不会移除扩展属性。在出现这种情况时,可能会显示以下错误:“TSD4001: 无法添加属性。‘XML 索引名称’已存在属性‘扩展属性名称’。(SQL 错误 = 15233)”。

说明:

若要解决此问题,必须将这些扩展属性的定义移到后期部署脚本中,而且必须在紧靠扩展属性定义的前面添加下面的语句:

IF NOT EXISTS (SELECT * FROM fn_listextendedproperty('ExtendedPropertyName', 'SCHEMA', N'SchemaName', 'TABLE', N'TableName', 'INDEX', N'XMLIndexName')

Team Foundation Build 的权限问题

使用 Team Foundation Build 生成和部署数据库项目时,可能会收到权限错误。默认情况下,Team Foundation Build 的服务帐户使用 Network Service 帐户。Network Service 帐户对生成计算机上的 SQL Server 实例没有必需的权限。

说明:

若要解决此问题,必须向 Network Service 帐户授予其他权限,或者将 Team Foundation Build 运行所使用的服务帐户更改为具有所需权限的帐户。有关更多信息,请参见 Database Edition 中必需的权限

生成过程中出现意外的标记警告

在使用 MSBuild 生成数据库项目时,可能出现意外的标记警告。如果重写 DefaultDataPath 并且未指定两个尾部反斜杠,则 \" 序列会被解释为引号的转义符。您将接收到生成警告,并且生成的生成脚本可能不完整。

说明:

若要解决此问题,必须在路径末尾指定双反斜杠。有关更多信息,请参见数据库生成和部署概述

从基于 x64 的计算机到远程数据库服务器的命令行部署失败

如果您没有为数据库项目明确指定目标连接,则将根据基于 x64 的本地计算机上的目录结构设置文件组和文件位置值。除非远程数据库服务器运行的也是 x64 操作系统和 32 位版本的 SQL Server,否则部署将失败。

说明:

若要解决此问题,必须在部署该数据库之前在数据库项目属性中明确指定目标数据库连接。有关更多信息,请参见 如何:为生成和部署配置数据库项目

请参见

任务

如何:修改数据库对象

如何:查看数据差异

概念

Database Edition 术语概述

其他资源

重命名数据库对象