Переменные MSBuild и sqlcmd в приложениях уровня данных PostDeployment.sql

Предисловие

Я использую проект приложения уровня данных и проект базы данных SQL CLR для управления частью базы данных моего приложения.
У меня есть 3 разных компьютера (для локальных сред, dev/ci/qa и preprod/prod соответственно), где должна быть установлена ​​часть базы данных.
В скрипте PostDeployment я создаю хранимые процедуры CLR (со сборкой) и учетные записи и пользователей.
Логины и пользователи должны отличаться в зависимости от конфигурации.

проблема

У меня проблема с использованием переменных. Вот сценарии PostDeployment, которые я пробовал

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>  

Это тоже не работает.

Спасибо.

1 ответ

Похоже, sqlcmdvars не поддерживаются. По крайней мере, они помечены как "Не применимо" для dacpac.

Другие вопросы по тегам