数据层应用程序中的 MSBuild 和 sqlcmd 变量 PostDeployment.sql

问题描述 投票:0回答:2

前言

我使用数据层应用程序项目和 SQL CLR 数据库项目来管理我的应用程序的数据库部分。
我有 3 台不同的机器(相应地用于本地、dev/ci/qa 和 preprod/prod 部署环境),其中应安装数据库部分。
在 PostDeployment 脚本中,我创建 CLR 存储过程(带有程序集)以及登录名和用户。
根据配置的不同,登录名和用户应该有所不同。

问题

我在使用变量时遇到问题。这是我尝试过的部署后脚本

GO
IF '$(DeploymentConfiguration)' = 'Debug'
BEGIN
    :r .\AddLoginsUsersRolesDev.sql
END
ELSE
BEGIN
    :r .\AddLoginsUsersRolesProd.sql
END
GO
....
ALTER DATABASE QProduction SET TRUSTWORTHY ON
GO
CREATE ASSEMBLY QProcedures from '[$(MSBuildProjectDir)]\Q.Core.Database.dll' WITH PERMISSION_SET = SAFE
GO
....

还有

GO
:setvar databasename "$(TargetDatabase)"
:setvar deploymentconfig "$(DeploymentConfiguration)"
:setvar msbuildprojectdir "$(MSBuildProjectDirectory)"

IF '$(deploymentconfig)' = 'Debug'
BEGIN
    :r .\AddLoginsUsersRolesDev.sql
END
ELSE
BEGIN
    :r .\AddLoginsUsersRolesProd.sql
END
GO
....
ALTER DATABASE QProduction SET TRUSTWORTHY ON
GO
CREATE ASSEMBLY QProcedures from '[$(msbuildprojectdir)]\Q.Core.Database.dll' WITH PERMISSION_SET = SAFE
GO
....

以下是添加登录名、用户的方法(AddLoginsUsersRolesDev.sql):

GO
IF NOT EXISTS 
    (SELECT name  
     FROM master.sys.server_principals
     WHERE name = 'Q\IUSR_Q')
BEGIN
    CREATE LOGIN [Q\IUSR_Q] FROM WINDOWS WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[us_english]
END

USE [$(databasename)]
GO
IF NOT EXISTS
    (SELECT name
     FROM sys.database_principals
     WHERE name = 'Q\IUSR_Q')
BEGIN
    CREATE USER [Q\IUSR_Q] FOR LOGIN [Q\IUSR_Q]
END
GO

USE [$(databasename)]
GO
EXEC sp_addrolemember N'db_datareader', N'Q\IUSR_Q'
GO

USE [$(databasename)]
GO
EXEC sp_addrolemember N'db_datawriter', N'Q\IUSR_Q'
....

对于 PostDeployment.sql 操作是 PostDeploy 并且 SQLCMD 模式已打开,对于包含脚本操作不在构建中。
部署失败,并显示“SQL 执行错误:发生致命错误。找不到变量 MSBuildProjectDirectory”。
据我所知,在数据库项目中,我可以使用 Database.sqlcmdvars 来实现此目的。 我应该如何解决这个问题?

更新

我已经添加了

<SqlCommandVariablesFile>Database.sqlcmdvars</SqlCommandVariablesFile>

到 .dbproj 文件并创建 Database.sqlcmdvars:

<SqlCommandVariables xmlns="urn:Microsoft.VisualStudio.Data.Schema.Package.SqlCmdVars">
  <Version>1.0</Version>
  <Properties>
    <Property>
      <PropertyName>databasename</PropertyName>
      <PropertyValue>Q</PropertyValue>
    </Property>
  </Properties>
</SqlCommandVariables>

这行不通。

我已经添加了

<ItemGroup>
  <SqlCommandVariableOverride Include="databasename=$(TargetDatabase)" />
</ItemGroup>  

这也行不通。

我已经添加了

<PropertyGroup>
 <databasename>Q</databasename>
 <SetVariables>
  <Variable Name="databasename" Value="Q" />
 </SetVariables>
</PropertyGroup>  

这也不起作用(我在某处读到可能的 MSBuild 变量应该与 sqlcmd 变量同名)。

我已将导入 SqlTasks.targets 项目移至 PostBuildEvent 部分之前。
之前:

<PropertyGroup>
 <PostBuildEvent/>
</PropertyGroup>
<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets" /> 

之后:

<Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\TeamData\Microsoft.Data.Schema.SqlTasks.targets" />
<PropertyGroup>
 <PostBuildEvent/>
</PropertyGroup>  

这也行不通。

谢谢。

deployment msbuild data-tier-applications
2个回答
0
投票

看起来 sqlcmdvars 不支持。至少它们被标记为“不适用”dacpac。


0
投票

试试这个:

https://learn.microsoft.com/en-us/sql/tools/sql-database-projects/concepts/sqlcmd-variables?view=sql-server-ver16&pivots=sq1-visual-studio#use-sqlcmd-发布操作中的变量

我也试图让它与 Azure 上的 MSBuild@1 一起工作,但作为使用 PowerShell 脚本和上面的命令的后备,检查它的结果,...我们可以在没有 MSBuild@1 的情况下相处:

      if ($LASTEXITCODE -ne 0) {
        throw "Failed to build DACPAC"
      }
© www.soinside.com 2019 - 2024. All rights reserved.