在 Pre 和 Post 部署脚本 SSDT 中访问构建变量

Access Build variables inside Pre and Post deployment scripts SSDT

我刚刚设置了一个 SSDT 项目,我想用它在我机器本地托管的 SQL 服务器上创建本地数据库。

我想添加一些用于初始化和清理的预部署和 post- 部署 SQL 脚本。

由于服务器和数据库名称可以更改,我使用项目属性分别为目标服务器和目标数据库定义了两个构建变量。

但是,我似乎无法在 post 部署脚本中访问它们。

下面的语法不会构建项目 -

use [$(TargetDatabaseName)]

此构建,但在发布时失败 -

use ['$(TargetDatabaseName)']

并且错误提示“'myTargetDB'”不存在(myTargetDB 在发布时作为值传递)

这可能是一件微不足道的事情,但我就是无法解决它。如果重要的话,我在 SQL 服务器 2016。

确保将两个脚本都置于 SQLCMD 模式。请参见下图,周围是红色。

定义目标变量后,请参见上图中的蓝色包围,它可以在 PostDeployment 脚本中安全使用,请参见下图中的蓝色包围。

如有任何疑问,请随时与我联系。

目标数据库的名称有一个预定义变量 $(DatabaseName)。您不需要创建自己的;即使这样做,您也需要为它们设置相同的值。

不确定目标服务器。在大多数情况下,SQL 脚本是在假设已经建立到正确服务器的连接的情况下生成的。当然,您可以使用 :connect $(TargetServerName) 之类的方法更改当前服务器,但我认为这只会导致混乱(实际上我不确定它是否有效)。

我能想到的唯一例外是您不能使用 SQLCMD 变量来参数化数据库文件的 logical/physical 名称 - 这些必须硬编码。

所有其他变量,如果在项目属性中声明,应该可以随处访问。下面是我的一个项目中 post 部署的片段:

use [master];
go

print 'Switching database ownership to sa...';
GO
alter authorization on database::[$(DatabaseName)] to [sa];
go


use [$(DatabaseName)];
go

print 'Creating database master key...';
go

-- Create database master key
create master key encryption by password = '$(DMK_Key)';
go

print 'Running database setup...';
go
exec dbo.init_database;
go

但是,您可能正在尝试引用位​​于不同服务器上的另一个数据库。如果是这种情况,您需要采用不同的方法,即:使用 Add database reference... 菜单为该远程数据库构建一个项目并将其 DACPAC 添加到项目引用列表中。在那里,您将能够为(链接的)服务器和数据库名称指定变量。