Развертывание членства в роли базы данных в средах тестирования

Джейсон Ли

В этом разделе описывается добавление учетных записей пользователей в роли базы данных в рамках развертывания решения в тестовой среде.

При развертывании решения, содержащего проект базы данных, в промежуточной или рабочей среде, как правило, разработчик не хочет автоматизировать добавление учетных записей пользователей в роли базы данных. В большинстве случаев разработчик не знает, какие учетные записи пользователей необходимо добавить в роли базы данных, и эти требования могут измениться в любое время. Однако при развертывании решения, содержащего проект базы данных, в среде разработки или тестирования ситуация обычно отличается:

  • Разработчик обычно повторно развертывает решение на регулярной основе, часто несколько раз в день.
  • База данных обычно повторно создается при каждом развертывании, что означает, что пользователи базы данных должны создаваться и добавляться в роли после каждого развертывания.
  • Разработчик обычно имеет полный контроль над целевой средой разработки или тестирования.

В этом сценарии часто полезно автоматически создавать пользователей базы данных и назначать членство в роли базы данных в рамках процесса развертывания.

Ключевым фактором является то, что эта операция должна быть условной на основе целевой среды. При развертывании в промежуточной или рабочей среде необходимо пропустить операцию. При развертывании в среде разработчика или тестовой среде необходимо развернуть членство в ролях без дополнительного вмешательства. В этом разделе описывается один из подходов, которые можно использовать для решения этой проблемы.

Этот раздел является частью серии учебников, основанных на требованиях к корпоративному развертыванию вымышленной компании Fabrikam, Inc. В этой серии руководств используется пример решения диспетчера контактов для представления веб-приложения с реалистичным уровнем сложности, включая приложение ASP.NET MVC 3, службу Windows Communication Foundation (WCF) и проект базы данных.

Метод развертывания в основе этих учебников основан на подходе с разделением файлов проекта, описанном в разделе Общие сведения о файле проекта, в котором процесс сборки управляется двумя файлами проекта: один содержит инструкции по сборке, которые применяются к каждой конечной среде, а второй содержит параметры сборки и развертывания для конкретной среды. Во время сборки файл проекта для конкретной среды объединяется в файл проекта, не зависящий от среды, чтобы сформировать полный набор инструкций по сборке.

Обзор задачи

Для этого раздела предполагается следующее.

Чтобы создать пользователей базы данных и назначить членство в роли при развертывании проекта базы данных в тестовой среде, вам потребуется:

  • Создайте скрипт Transact язык SQL (Transact-SQL), который вносит необходимые изменения в базу данных.
  • Создайте целевой объект Microsoft Build Engine (MSBuild), который использует служебную программу sqlcmd.exe для выполнения скрипта SQL.
  • Настройте файлы проекта для вызова целевого объекта при развертывании решения в тестовой среде.

В этом разделе показано, как выполнить каждую из этих процедур.

Создание скриптов для членства в роли базы данных

Скрипт Transact-SQL можно создать различными способами и в любом выбранном расположении. Самый простой подход — создать скрипт в решении в Visual Studio 2010.

Создание скрипта SQL

  1. В окне Обозреватель решений разверните узел проекта базы данных.

  2. Щелкните правой кнопкой мыши папку Скрипты , наведите указатель на пункт Добавить и выберите пункт Создать папку.

  3. Введите Test в качестве имени папки и нажмите клавишу ВВОД.

  4. Щелкните правой кнопкой мыши папку Тест , наведите указатель на пункт Добавить и выберите пункт Скрипт.

  5. В диалоговом окне Добавление нового элемента присвойте скрипту понятное имя (например, AddRoleMemberships.sql) и нажмите кнопку Добавить.

    В диалоговом окне Добавление нового элемента присвойте скрипту понятное имя (например, AddRoleMemberships.sql) и нажмите кнопку Добавить.

  6. В файле AddRoleMemberships.sql добавьте инструкции Transact-SQL, которые:

    1. Создайте пользователя базы данных для имени входа SQL Server, который будет обращаться к базе данных.
    2. Добавьте пользователя базы данных в все необходимые роли базы данных.
  7. Файл должен выглядеть следующим образом:

    USE $(DatabaseName)
    GO
    CREATE USER [FABRIKAM\TESTWEB1$] FOR LOGIN[FABRIKAM\TESTWEB1$]
    GO
    USE [ContactManager]
    GO
    EXEC sp_addrolemember N'db_datareader', N'FABRIKAM\TESTWEB1$'
    GO
    USE [ContactManager]
    GO
    EXEC sp_addrolemember N'db_datawriter', N'FABRIKAM\TESTWEB1$'
    GO
    
  8. Сохраните файл.

Выполнение скрипта в целевой базе данных

В идеале при развертывании проекта базы данных необходимо запускать все необходимые скрипты Transact-SQL в рамках скрипта после развертывания. Однако скрипты после развертывания не позволяют выполнять логику условно на основе конфигураций решения или свойств сборки. Вместо этого можно запустить скрипты SQL непосредственно из файла проекта MSBuild, создав элемент Target , который выполняет команду sqlcmd.exe. Для выполнения скрипта в целевой базе данных можно использовать следующую команду:

sqlcmd.exe –S [Database server] –d [Database name] –i [SQL script]

Примечание

Дополнительные сведения о параметрах командной строки sqlcmd см. в разделе служебная программа sqlcmd.

Перед внедрением этой команды в целевой объект MSBuild необходимо подумать о том, при каких условиях скрипт должен выполняться:

  • Целевая база данных должна существовать до изменения членства в роли. Таким образом, этот скрипт необходимо запустить после развертывания базы данных.
  • Необходимо включить условие, чтобы скрипт выполнялся только для тестовых сред.
  • Если вы выполняете развертывание "что если", другими словами, если вы создаете скрипты развертывания, но не выполняете их на самом деле, не следует запускать скрипт SQL.

Если вы используете подход с разделением файла проекта, описанный в разделе Общие сведения о файле проекта, как показано в примере решения Диспетчера контактов, инструкции по сборке для скрипта SQL можно разделить следующим образом:

  • Все необходимые свойства среды вместе со свойством, которое определяет, следует ли развертывать разрешения, должны находиться в файле проекта для конкретной среды (например, Env-Dev.proj).
  • Сам целевой объект MSBuild вместе со свойствами, которые не будут изменяться между целевыми средами, должен находиться в универсальном файле проекта (например, Publish.proj).

В файле проекта для конкретной среды необходимо определить имя сервера базы данных, имя целевой базы данных и логическое свойство, позволяющее пользователю указать, следует ли развертывать членство в роли.

<PropertyGroup>
   <CmTargetDatabase Condition=" '$(CmTargetDatabase)'=='' ">
      ContactManager
   </CmTargetDatabase>
   <DatabaseServer Condition=" '$(DatabaseServer)'=='' ">
      TESTDB1
   </DatabaseServer>
   <DeployTestDBRoleMemberships Condition="'$(DeployTestDBRoleMemberships)'==''">
      true
   </DeployTestDBRoleMemberships>
</PropertyGroup>

В файле универсального проекта необходимо указать расположение исполняемого файла sqlcmd и расположение скрипта SQL, который требуется запустить. Эти свойства останутся неизменными независимо от среды назначения. Для выполнения команды sqlcmd необходимо также создать целевой объект MSBuild.

<PropertyGroup>
   <SqlCmdExe Condition=" '$(SqlCmdExe)'=='' ">
      C:\Program Files\Microsoft SQL Server\100\Tools\Binn\sqlcmd.exe
   </SqlCmdExe>
</PropertyGroup>

<Target Name="DeployTestDBPermissions" 
        Condition=" '$(DeployTestDBRoleMemberships)'=='true' AND 
                    '$(Whatif)'!='true' ">
   <PropertyGroup>
     <SqlScript>
        $(SourceRoot)ContactManager.Database\Scripts\Test\AddRoleMemberships.sql
     </SqlScript>
     <_Cmd>"$(SqlCmdExe)" -S "$(DatabaseServer)" 
                          -d "$(CmTargetDatabase)" 
                          -i "$(SqlScript)"
     </_Cmd>
   </PropertyGroup>
   <Exec Command="$(_Cmd)" ContinueOnError="false" />
</Target>

Обратите внимание, что вы добавляете расположение исполняемого файла sqlcmd в качестве статического свойства, так как это может быть полезно для других целевых объектов. В отличие от этого, вы определяете расположение скрипта SQL и синтаксис команды sqlcmd в качестве динамических свойств в целевом объекте, так как они не потребуются перед выполнением целевого объекта. В этом случае целевой объект DeployTestDBPermissions будет выполняться только при соблюдении следующих условий:

  • Для свойства DeployTestDBRoleMemberships задано значение true.
  • Пользователь не указал флаг WhatIf=true .

Наконец, не забудьте вызвать целевой объект. В файле Publish.proj это можно сделать, добавив целевой объект в список зависимостей для целевого объекта FullPublish по умолчанию. Необходимо убедиться, что целевой объект DeployTestDBPermissions не выполняется, пока не будет выполнен целевой объект PublishDbPackages .

<Project ToolsVersion="4.0" 
         DefaultTargets="FullPublish" 
         xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
   ...
   <PropertyGroup>
      <FullPublishDependsOn>
         Clean;
         BuildProjects;
         GatherPackagesForPublishing;
         PublishDbPackages;
         DeployTestDBPermissions;
         PublishWebPackages;
      </FullPublishDependsOn>
   </PropertyGroup>
   <Target Name="FullPublish" DependsOnTargets="$(FullPublishDependsOn)" />
</Project>

Заключение

В этом разделе описан один из способов добавления пользователей базы данных и членства в роли в качестве действия после развертывания при развертывании проекта базы данных. Обычно это удобно при регулярном повторном создании базы данных в тестовой среде, но обычно этого следует избегать при развертывании баз данных в промежуточной или рабочей среде. Таким образом, вы должны использовать необходимую условную логику, чтобы пользователи базы данных и членства в роли создавались только в том случае, если это необходимо.

Дополнительные материалы

Дополнительные сведения об использовании VSDBCMD для развертывания проектов баз данных см. в разделе Развертывание проектов баз данных. Инструкции по настройке развертываний баз данных для разных целевых сред см. в статье Настройка развертываний баз данных для нескольких сред. Дополнительные сведения об использовании пользовательских файлов проекта MSBuild для управления процессом развертывания см. в разделах Общие сведения о файле проекта и Общие сведения о процессе сборки. Дополнительные сведения о параметрах командной строки sqlcmd см. в разделе служебная программа sqlcmd.