SSDT - 如何更改每个构建配置的数据库对象名称

SSDT - How to change database object names per build configuration

问题:

我想使用一个 SSDT 数据库项目来管理我的数据库。我想在其中集中数据库开发和自动化部署(主要是存储过程)。 在多租户环境中,对象名称前面是公司名称, 示例:

[dbo].[spu_COMPANY_NAME$Stored Procedure Name]

我们有一个中央数据库,我们在其中进行开发,每次发布时,我们都会对公司名称进行 'Replace All'。

SQLCMD 变量不起作用,因为它们不能包含在对象名称中。 有没有一种方法可以构建,以便在 build/publish 期间为每个构建配置定制存储过程,我得到这样的文件夹结构:

--Database.Project/
  --bin/
     --CompanyA(build.companyA.congig)/
     --CompanyB(build.companyB.congig)/

正如@PeterSchott 在之前的评论中提到的,通过 Powershell 脚本和 Pre/Post 在 Visual Studio 中构建事件可以轻松实现该解决方案。

我会 post 在这里回答,以防有人需要它作为参考(或者也许我需要它)


第一个:

Prebuild powershell 脚本,这个脚本获取项目目录,并根据构建配置将所有字符串替换为 'COMPANY_NAME' 到实际公司名称,用于所有文件其中包含 .sql 扩展名。

下一个:

powershell 脚本:

if ($args[0] -eq "Release"){
    $company_name = "ReleaseCorp";
}

$dboDir = $args[1] + 'dbo\';

$sqlFiles = Get-ChildItem $dboDir -rec | Where-Object {($_.Extension -eq ".sql")}

foreach ($file in $sqlFiles)
{
    echo $file;
    (Get-Content $file.PSPath) |
    Foreach-Object { $_ -replace "COMPANY_NAME", $company_name } |
    Set-Content $file.PSPath
}

Post-build 事件执行相反的操作,只是这次它采用实际的公司名称进行配置并将其放回令牌,以用于即将到来的构建。

值得注意的是,为了 Visual Studio 能够 运行 Powershell (x86) 脚本,必须执行以下步骤:

运行 Windows 管理员模式下的 Powershell (x86),以及 运行 :

set-executionpolicy unrestricted

有关此内容的更多信息,请参阅 David Frette 的信息博客 post: Creating Powershell pre-build and post-build events for Visual Studio projects