访问Pre和Post部署脚本SSDT中的Build变量

时间:2019-05-02 05:18:48

标签: sql-server sql-server-data-tools sqlcmd database-project dacpac

我刚刚建立了一个SSDT项目,我想使用该项目在计算机本地托管的SQL Server上创建本地数据库。

我想添加一些部署前和部署后的SQL脚本以进行初始化和清理。

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

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

下面的语法无法构建项目-

use [$(TargetDatabaseName)]

这可以构建,但是在发布时失败-

use ['$(TargetDatabaseName)']

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

这可能是一件微不足道的事情,但我只是无法解决。如果那很重要,我就在SQL Server 2016上。

2 个答案:

答案 0 :(得分:0)

确保将两个脚本都置于SQLCMD模式。请参见下面带有红色的图像。

pasteBin

一旦定义了目标变量,请在上图中用蓝色包围,可以在PostDeployment脚本中安全地使用它,请在下图中用蓝色包围。 enter image description here

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

答案 1 :(得分:0)

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

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

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

所有其他变量,如果在项目属性中声明,则应可在任何地方访问。以下是我其中一个项目的部署后片段:

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添加到项目引用列表中。在那里,您将能够为(链接的)服务器和数据库名称指定变量。