Переменные 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.