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

时间:2018-07-05 14:11:47

标签: multi-tenant sql-server-data-tools continuous-deployment

问题:

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

  

[dbo]。[spu_COMPANY_NAME $存储过程名称]

我们有一个中央数据库,我们在其中进行开发,每次发布时,我们都会对公司名称进行“全部替换”。

SQLCMD变量不会执行,因为它们不能包含在对象名称中。 有没有一种我可以构建的方法,以便在构建/发布期间,对于每种构建配置,在定制过程中都获得量身定制的存储过程,我会得到一个像这样的文件夹结构:

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

1 个答案:

答案 0 :(得分:0)

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

如果有人需要它作为参考(或者也许我需要),我会在这里发布答案


第一

Prebuild powershell脚本,该脚本将获取项目目录,并将所有带有.sql扩展名的文件(根据构建配置)替换为'COMPANY_NAME'的所有字符串为实际的公司名称。

enter image description here

下一步:

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
}

构建后事件会进行相反的操作,只是这次需要使用实际的公司名称进行配置,然后将其放回令牌中,以便进行后续构建。

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

以管理员模式运行Windows Powershell(x86),然后运行:

  

set-executionpolicy不受限制

有关此问题的更多信息,请参见David Frette的内容丰富的博客文章: Creating Powershell pre-build and post-build events for Visual Studio projects