更新:2007 年 11 月
可以创建或导入那些引用其他数据库中对象的数据库对象。这些跨数据库引用要求您在数据库项目的属性中定义相应的引用。如果您引用其他数据库中的对象,但是未在项目中定义相应的引用,则将出现警告。对于所引用的每个数据库,可以定义与要引用的服务器和数据库相对应的 SETVAR 变量。在修改某个对象的定义以包括该引用时,可以通过使用这些变量(而不是服务器和数据库的显式名称)来定义该对象。在生成数据库项目时,这些变量将替换为您指定的值。
![]() |
---|
若要使跨数据库引用特定于某个生成配置,必须使用 MSBuild 变量来为这些引用定义 SETVAR 变量。例如,可以使用一组 MSBuild 变量生成数据库项目并将其部署到临时服务器,可以使用另一组变量生成同一个项目并将其部署到成品服务器。如果您使用服务器名称和数据库名称为某个跨数据库引用定义 SETVAR 变量,则该引用将按照同样的方式工作,而与所指定的生成配置无关。 |
跨数据库引用方案
Visual Studio Team System Database Edition 支持下列方案:
您创建了一个数据库项目并导入了现有数据库中的架构。该架构中包含的对象引用一个或多个其他数据库中的对象。在项目属性中,定义一个相应的引用,并将服务器和数据库的显式名称替换为 SETVAR 变量。由于进行了此定义,因此跨数据库引用可以在设计时进行验证。还可以将数据库项目部署到独立开发环境中,在该环境中,目标服务器的名称与生产环境中目标服务器的名称不同。
您有一个包含跨数据库引用的数据库项目,这些引用使用 SETVAR 变量来标识服务器和数据库。您希望更改这些变量的名称并更新包含这些引用的对象定义。
您希望在所开发的数据库项目中引用其他数据库的架构。您希望与团队中的其他成员仅共享这些架构,而不必与他们共享其他数据库项目。您可以为这些其他项目添加一个对数据库图元文件 (.dbmeta) 的引用,并且仅将这些图元文件签入版本控制中。使用此方法,可以限制对包含要引用的架构的数据库项目的访问。如果您希望部署某个数据库项目,而不部署依赖它的任何项目,也应当使用此方法。
可以使用数据库重构功能来针对跨数据库引用执行其他任务。有关更多信息,请参见如何:重命名对服务器或数据库的引用。
对数据库项目和图元文件的引用
当您在数据库项目中添加某个引用时,可以指定另一个数据库项目,也可以指定在生成数据库项目时生成的图元文件。
在以下情况下应当引用另一个数据库项目:
- 必须对将包含该引用的数据库和将要引用的数据库都进行架构更改。在部署包含该引用的数据库项目时,将会同时部署所引用的数据库项目。
在以下情况下应当引用数据库图元文件:
必须引用其项目不在当前解决方案中的数据库。
必须部署单个项目,而不部署它所依赖的项目。
要引用的数据库架构不太可能发生变化。在这种情况下,可以将数据库图元文件签入版本控制中。
跨数据库引用的限制
当导入数据库架构时,在引用对象定义中的其他数据库时会生成警告,因为在部署数据库项目之前,数据库项目不能验证这些引用。在项目属性中定义数据库引用之后,可以验证对象定义并解决这些警告,然后可以通过将服务器和数据库的名称替换为变量来更新对象定义。还可以使用重构功能来执行这种替换。有关更多信息,请参见如何:创建跨数据库引用和如何:重命名对服务器或数据库的引用。
所引用的服务器和数据库的变量及其值并不特定于某个生成配置。若要在命令提示符处指定服务器和数据库,必须使用 MSBuild 变量来引用它们,这些变量可在部署时替换成相应的名称。
还存在以下限制:
只有当您具有与某个数据库相对应的数据库项目时,才能添加对该数据库的引用。
必须生成一个数据库项目,才能添加对该数据库项目的图元文件的引用。
必须生成要引用的数据库项目,才能在不出现警告的情况下解析对这些数据库项目的跨数据库引用。
如果您更改解决方案的生成配置,或者更改要引用的数据库项目的生成配置,则可能需要重新生成解决方案,以便在不出现警告的情况下解析对这些数据库项目的跨数据库引用。
如果要引用另一台服务器上某个数据库项目中的对象,则必须将该服务器定义为目标服务器上的链接服务器。有关更多信息,请参见如何:创建跨数据库引用。
在引用 master 数据库时无需使用跨数据库引用。
包括 SETVAR 变量的引用必须总是采用“[$(变量名)]”形式。如果您省略了中括号,则可能会无法部署数据库项目。
SETVAR 变量的名称必须唯一。如果服务器与数据库同名,则必须定义具有不同名称但是可解析为同一个值的变量。
安全注意事项
在生成某个数据库项目时创建的图元文件包含该项目的架构信息。您应当限制对图元文件的访问权限以保护该架构信息。可以通过将图元文件签入版本控制中(而不是将它们部署到目标服务器)来与团队中的其他成员共享图元文件。如果数据库项目与要引用的数据库位于同一个解决方案中,那么,该项目的其他开发人员在同步到版本控制并生成解决方案时,他们将拥有访问权限。
示例
如果您有两个数据库项目(ReportDb 和 DependentDb),您可能希望在 ReportDb 中引用 DependentDb 中的对象。您首先在 DependentDb 数据库项目的属性中添加一个引用,并按如下方式定义变量:
RefServer
RefDatabase
RefServer 的值与 DependentDb 所在服务器的名称相同。RefDatabase 的值与由 DependentDb 项目部署的目标数据库的名称相同。在该示例中,RefServer 的值为 StageSvr,RefDatabase 的值为 DepDb。
可以向 ReportDb 中添加一个视图,在该视图中,DependentDb 上 Employee 表中的所有列都处于选中状态,DependentDb 已部署到 StageSvr 服务器上的 DepDb 数据库。可以按如下方式为该视图创建对象定义:
CREATE VIEW [dbo].[DependentView]
AS
SELECT * FROM [$(RefServer)].[$(RefDatabase)].[dbo].[Employee]
;