问题:
我想使用一个SSDT数据库项目来管理我的数据库。我想集中管理数据库开发并自动进行部署(主要是存储过程)。 在多租户环境中,对象名称前面带有公司名称, 示例:
[dbo]。[spu_COMPANY_NAME $存储过程名称]
我们有一个中央数据库,我们在其中进行开发,每次发布时,我们都会对公司名称进行“全部替换”。
SQLCMD变量不会执行,因为它们不能包含在对象名称中。 有没有一种我可以构建的方法,以便在构建/发布期间,对于每种构建配置,在定制过程中都获得量身定制的存储过程,我会得到一个像这样的文件夹结构:
--Database.Project/
--bin/
--CompanyA(build.companyA.congig)/
--CompanyB(build.companyB.congig)/
答案 0 :(得分:0)
正如@PeterSchott在先前的评论中提到的,该解决方案可以通过Powershell脚本和Visual Studio中的Pre / Post构建事件轻松实现。
如果有人需要它作为参考(或者也许我需要),我会在这里发布答案
第一
Prebuild powershell脚本,该脚本将获取项目目录,并将所有带有.sql扩展名的文件(根据构建配置)替换为'COMPANY_NAME'的所有字符串为实际的公司名称。
下一步:
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