我使用Visual Studio 2013和TFS,而不是SQL-Server 2012.特别是我在VS中使用SQL-Server数据工具进行SQL开发,而不是在SQL-Server Management Studio中。< / p>
简而言之,SQLPackage似乎不会执行Post-Deployment SQL脚本。
具体是:我有一个VS SQL数据库项目&#39; ADMIR&#39;,它在过去几周内一直在发展,并且在SQL和它的部署方面逐渐变得更加复杂。该数据库包括一些动态生成的表,因此我引入了SQL命令变量来引用两个数据库(一个是实际的ADMIR数据库,另一个是同一服务器上的数据库)。因此,我已经为这两个数据库添加了数据库引用到dacpac。
ADMIR项目将构建良好。
还有一个部署后的SQL脚本,在引入SQL命令变量之前,这也可以正常运行并初始化各种表数据。
但是,我的理解是SQL Command Variables不能使用VS / TFS Publish操作,因为不再执行Post-Deployment脚本。
这没关系,因为最终我想编写/自动化ADMIR项目的发布/部署,所以我已经开始使用SQLPackage来执行发布。
同样,这似乎工作正常 - 我的SQL包批处理命令将执行并记录错误/输出(如果适用)并成功将我的Build dacpac发布到目标服务器。但是,它似乎完全忽略了Post-Deployment脚本。此外,输出报告未设置SQL命令变量。
这些是各种脚本和配置设置:
SQLPackage批处理命令:
::Publish the ADMIR database using the ADMIR.DEV.Publish.xml Profile.
"C:\Program Files (x86)\Microsoft SQL Server\120\DAC\bin\SqlPackage.exe"
/Action:Publish
/Profile:"C:\Source Control\ADMIR\ReleaseControl\ADMIR.DEV.publish.xml"
/SourceFile:"C:\Source Control\ADMIR\Build\ADMIR.dacpac"
2> "C:\Source Control\ADMIR\ReleaseControl\Publish_Error.txt"
> "C:\Source Control\ADMIR\ReleaseControl\Publish_Output.txt"
ADMIR.DEV.publish.xml发布资料:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<IncludeCompositeObjects>True</IncludeCompositeObjects>
<TargetDatabaseName>ADMIR</TargetDatabaseName>
<DeployScriptFileName>ADMIR.sql</DeployScriptFileName>
<TargetConnectionString>Data Source=FOOBAR;Integrated Security=True;Pooling=False</TargetConnectionString>
<ProfileVersionNumber>1</ProfileVersionNumber>
</PropertyGroup>
<ItemGroup>
<SqlCmdVariable Include="ADMIRDatabaseName">
<Value>ADMIR</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="XYZDatabaseName">
<Value>XYZDEV</Value>
</SqlCmdVariable>
</ItemGroup>
</Project>
Script.PostDeploy.sql(前几行):
/* ADMIR Post-Deployment Script Template */
PRINT N'Post Deploy Script started:'+CAST(GETDATE() AS NVARCHAR(20))+N'.'
PRINT N'SQLCMD Variable $ADMIRDBName:'+[$(ADMIRDatabaseName)]+N'.'
PRINT N'SQLCMD Variable $XYZDBName:'+[$(XYZDatabaseName)]+N'.'
/* Purge existing data as we'll repopulate with what is required for a fresh deploy */
PRINT N'Purging existing table data...'
DELETE FROM [ADMIR].[Engine].[ProcessingStatus]
DELETE FROM [ADMIR].[Engine].[DataField]
DELETE FROM [ADMIR].[Engine].[DataKeyField]
...
...
运行Build时,我可以看到ADMIR_Create.sql脚本确实包含所有Post-Deploy语句。即我可以在此文件中看到上面的代码行。
** ADMIR.sqlproj文件包含Post-Deploy脚本和SQL命令变量:**
<ItemGroup>
...
...
<PostDeploy Include="ReleaseControl\Script.PostDeploy.sql" />
</ItemGroup>
...
...
<ItemGroup>
<SqlCmdVariable Include="ADMIRDatabaseName">
<DefaultValue>ADMIR</DefaultValue>
<Value>$(SqlCmdVar__7)</Value>
</SqlCmdVariable>
<SqlCmdVariable Include="XYZDatabaseName">
<DefaultValue>XYZDEV</DefaultValue>
<Value>$(SqlCmdVar__6)</Value>
</SqlCmdVariable>
发布日志,Publish_Output.txt:
Publishing to database 'ADMIR' on server 'FOOBAR'.
Initializing deployment (Start)
*** The following SqlCmd variables are not defined in the target scripts: ADMIRDatabaseName XYZDatabaseName.
Initializing deployment (Complete)
Analyzing deployment plan (Start)
Analyzing deployment plan (Complete)
Updating database (Start)
Update complete.
Updating database (Complete)
Successfully published database.
所以:
为什么没有执行Post-Deployment脚本?我没有看到任何与之相关的记录信息。
为什么SQLPackage输出日志表明SQL命令变量在发布配置文件中没有定义?
可能与2.sqlproj文件是否正确有关,SQL命令变量的值是变量本身,例如$(SqlCmdVar__7)? __6&amp; __7来自?
感谢您的帮助!
答案 0 :(得分:0)
根据我的评论http://www.CSIO.org/standards/PC_Surety/CSIO4.3.0/xml/,似乎是原因。即,与数据库的dacpac同名的SQLCMD变量导致脚本未被执行。当我删除此引用,并将相关的SQLCMD变量更改为数据库名称的文字值时,则项目构建并根据需要执行部署后脚本。
答案 1 :(得分:0)