在数据库项目中使用引用
您可以在数据库项目中添加多种类型的引用以应对不同的情况。 对于不同类型的引用,所使用的过程会略有不同。
下表对您可以添加的引用类型以及每种类型应对的情况进行了说明。
引用类型 |
使用原因 |
---|---|
当前解决方案中的数据库项目 (.dbproj) |
添加这种类型的引用可以实现若干种方案。
如果添加对另一个项目的引用但不定义任何变量,则会创建复合项目。 当您部署这种类型的项目时,还会同时部署其他项目中的对象。 有关更多信息,请参见本主题后面的使用引用创建组合项目。 |
来自当前解决方案或另一个解决方案的数据库项目输出(.dbschema 文件) |
如果您必须引用另一个数据库中的对象,但不希望其他开发人员使用该数据库,则可以添加对数据库架构文件的引用。 当希望阻止更改或者当无法更新数据库时,可以采用此方法。 例如,如果您的数据库项目必须引用在服务器上定义并共享,但由多个数据库项目使用的登录名或密钥,则可以添加对 .dbschema 文件的引用。 有关更多信息,请参见对引用共享服务器对象的数据库开始团队开发。 您可能需要引用包含服务器对象的定义的 .dbschema 文件,但不希望在部署数据库项目时验证服务器上的设置。 对于这种情况,您可以添加对 master.dbschema 文件的引用,并为值为“master”的数据库变量定义一个文本。 这样,才能在不出现错误的情况下解析您对“master”数据库中定义的对象的引用。 有关文本的更多信息,请参见本主题后面的使用文本引用数据库。 |
包含系统对象的定义的 master.dbschema 文件 |
如果您需要引用系统对象(如系统存储过程、系统表、系统视图或系统目录),则必须添加对相应 master.dbschema 的引用才能解析这些引用。 例如,您可能需要在某个存储过程中引用 sys.sysobjects。 对于每个支持的 SQL Server 版本,Visual Studio 高级专业版都提供了一个 master.dbschema 文件。 您可以在 [Program Files]\Microsoft Visual Studio 10.0\VSTSDB\Extensions\SqlServer\版本\DBSchemas 中找到 .dbschema 文件,其中版本 是您使用的 SQL Server 的版本(如 2005 或 2008)。 对于这种情况,您可以添加对相应 master.dbschema 文件的引用,并为值为“master”的数据库变量定义一个文本。 这样,才能在不出现错误的情况下解析您对“master”数据库中定义的对象的引用。 有关文本的更多信息,请参见本主题后面的使用文本引用数据库。 |
当前解决方案中的 SQL 公共语言运行时 (CLR) 项目 |
如果您正在开发一个或多个要用数据库项目进行部署的 SQLCLR 对象,则可以引用当前解决方案中的 SQLCLR 项目。 当您部署数据库项目时,还会同时部署所引用的 SQLCLR 项目生成的程序集。 CREATE ASSEMBLY 语句根据您为该引用指定的属性生成。 有关更多信息,请参见本主题后面的开始引用 SQLCLR 对象的数据库的团队开发和使用跨数据库引用。 |
来自当前解决方案中的项目或其他源的 SQLCLR 程序集 |
如果您的数据库项目必须引用某个 SQLCLR 程序集中定义的对象,但当时并未开发此对象或不是由同一支团队开发此对象,则可以添加对该 SQLCLR 程序集的引用。 当您部署数据库项目时,还会同时部署所引用的程序集。 |
.xsd 文件中定义的 XML 架构定义 |
必须先注册一个架构,然后才能将此架构与变量、参数或列关联来创建类型化 XML 变量、参数和列。 如果以下任意一个表述属实,则您可能需要使用类型化 XML:
有关更多信息,请参见对使用 XML 架构集合的数据库开始团队开发。 |
定义跨数据库引用
如果您创建或导入的数据库对象引用其他数据库中的对象,则必须在数据库项目的属性中定义相应的引用。 对于所引用的每个数据库,您可以定义与要引用的服务器和数据库相对应的 SETVAR 变量。 在修改某个对象的定义以包括该引用时,可以通过使用这些变量(而不是服务器和数据库的显式名称)来定义该对象。 在生成数据库项目时,这些变量将替换为您指定的值。
跨数据库引用方案
Visual Studio 高级专业版支持下列方案:
您创建了一个数据库项目并导入了现有数据库中的架构。 该架构中包含的对象引用一个或多个其他数据库中的对象。 在项目属性中,定义一个相应的引用,并将服务器和数据库的显式名称替换为 SETVAR 变量。 由于进行了此定义,因此跨数据库引用可以在设计时进行验证。 还可以将数据库项目部署到独立开发环境中,在该环境中,目标服务器的名称可能与生产环境中目标服务器的名称不同。
您有一个包含跨数据库引用的数据库项目,这些引用使用 SETVAR 变量来标识服务器和数据库。 您希望更改这些变量的名称并更新包含这些引用的对象定义。
您希望在所开发的数据库项目中引用其他数据库的架构。 您希望与团队中的其他成员仅共享这些架构,而不必与他们共享其他数据库项目。 您可以为这些其他项目添加一个对数据库架构文件 (.dbschema) 的引用,并且仅将这些架构文件签入到版本控制中。 使用此方法,可以限制对包含要引用的架构的数据库项目的访问。 如果您希望部署某个数据库项目,而不部署依赖它的任何项目,也应当使用此方法。
可以使用数据库重构功能来针对跨数据库引用执行其他任务。 有关更多信息,请参见如何:重命名对服务器或数据库的引用。
对数据库项目和架构文件的引用
当您在数据库项目中添加某个引用时,可以指定另一个数据库项目,也可以指定在生成数据库项目时生成的架构文件。
如果以下任意一个表述属实,则应引用另一个数据库项目:
- 必须同时对将包含该引用的数据库的架构和要引用的数据库的架构进行更改。 在部署包含该引用的数据库项目时,将会同时部署所引用的数据库项目。
如果以下任意一个表述属实,则应引用架构文件:
必须引用其项目不在当前解决方案中的数据库。
必须部署单个项目,而不部署它所依赖的项目。
要引用的数据库架构不太可能发生变化。 在这种情况下,可以将架构文件签入到版本控制中。
跨数据库引用的限制
当导入数据库架构时,在引用对象定义中的其他数据库时会生成警告,因为在部署数据库项目之前,数据库项目不能验证这些引用。 在项目属性中定义数据库引用之后,可以验证对象定义并解决这些警告, 然后可以通过将服务器和数据库的名称替换为变量来更新对象定义。 还可以使用重构功能来执行这种替换。 有关更多信息,请参见如何:添加对数据库项目的引用和如何:重命名对服务器或数据库的引用。
所引用的服务器和数据库的变量及其值并不特定于某个生成配置。 若要在命令提示符处指定服务器和数据库,必须使用 MSBuild 变量来引用它们,这些变量可在部署时替换成相应的名称。
还存在以下限制:
只有当您具有与某个数据库相对应的数据库项目时,才能添加对该数据库的引用。
必须先生成一个数据库项目,然后才能添加对该数据库项目的架构文件的引用。
必须生成要引用的数据库项目,才能在不出现警告的情况下解析对这些数据库项目的跨数据库引用。
如果您更改解决方案的生成配置,或者更改要引用的数据库项目的生成配置,则可能需要重新生成解决方案,以便在不出现警告的情况下解析对这些数据库项目的跨数据库引用。
如果要引用另一台服务器上某个数据库项目中的对象,则必须将该服务器定义为目标服务器上的链接服务器。 有关更多信息,请参见如何:添加对数据库项目的引用。
在引用 master 数据库时无需使用跨数据库引用。
包括 SETVAR 变量的引用必须总是采用“[$(变量名)]”形式。 如果您省略了中括号,则可能会无法部署数据库项目。
SETVAR 变量的名称必须唯一。 如果服务器与数据库同名,则必须定义具有不同名称但可解析为同一个值的变量。
安全注意事项
在生成某个数据库项目时创建的架构文件包含该项目的架构信息。 您应当限制对此类型文件的访问以保护该架构信息。 可以通过将架构文件签入到版本控制中(而不是将它们部署到目标服务器)来与团队中的其他成员共享架构文件。 如果数据库项目与要引用的数据库位于同一个解决方案中,那么,该项目的其他开发人员在同步到版本控制并生成解决方案时,他们将拥有访问权限。
跨数据库引用示例
如果您有两个数据库项目,ReportDb 和 DependentDb,您可能希望在 ReportDb 中引用 DependentDb 中的对象。 您首先在 DependentDb 数据库项目的属性中添加一个引用,并按如下方式定义变量:
RefServer
RefDatabase
RefServer 的值与 DependentDb 所在服务器的名称相同。 RefDatabase 的值与由 DependentDb 项目部署的目标数据库的名称相同。 在此示例中,RefServer 的值为 StageSvr,RefDatabase 的值为 DepDb。
您可以向 ReportDb 中添加一个视图,该视图显示 DependentDb 中 Employee 表的所有列。 将该表部署到名为 StageSvr 的服务器上名为 DepDb 的数据库中。 可以通过添加以下语句,为该视图创建对象定义:
CREATE VIEW [dbo].[DependentView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].[dbo].[Employee]
;
使用引用创建复合项目
数据库和服务器项目并不能应对您在开发数据库时可能遇到的所有情况。 为了应对更加复杂的情况,您可以根据两个或两个以上的其他项目创建复合项目。
当在一个数据库项目中添加对另一个数据库或服务器项目的引用,但不为所引用项目中的服务器和数据库变量提供值时,可以创建复合项目。 添加这种类型的引用时,向其添加引用的项目包含引用指向的项目中的所有对象和设置。
通过创建复合项目,可以实现以下方案:
您可以管理引用共享登录名或密钥的数据库架构。 有关更多信息,请参见对引用共享服务器对象的数据库开始团队开发。
您可以将大型数据库划分为多个子项目来提高性能或分隔架构或对象类型。 如果多个数据库共用某些对象,但在其他方面有所不同,则您也可能需要进行这样的更改。 仅当这样的更改不会创建循环引用时,才可以将项目划分为两个或两个以上的子项目。
当您部署复合项目时,还会同时部署其引用的所有数据库项目中的对象。 有关更多信息,请参见开始大型数据库的团队开发。
使用文本引用数据库
您可以定义数据库引用变量以在目标部署环境中指定所引用的数据库的名称。 如果由于目标数据库名称在部署环境中始终相同而不希望使用 SQLCMD 变量,则可改为指定值为所引用数据库的名称的文本。
如果使用变量,则语法可能如下所示:
CREATE VIEW [dbo].[View1] AS SELECT * FROM [($MasterDbVar)].[dbo].[spt_values].
如果改为使用文本,则语法可能如下所示:
CREATE VIEW [dbo].[View1] AS SELECT * FROM [master].[dbo].[spt_values]
有关如何指定文本值的更多信息,请参见如何:添加对数据库项目的引用。