Переменные MSBuild и sqlcmd в приложениях уровня данных PostDeployment.sql - PullRequest
2 голосов
/ 31 октября 2011

Введение

Я использую проект приложения уровня данных и проект базы данных 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 Ответ

0 голосов
/ 11 ноября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...