Nasazení členství v databázových rolích do testovacího prostředí

Jason Lee

Toto téma popisuje, jak přidat uživatelské účty do databázových rolí v rámci nasazení řešení do testovacího prostředí.

Když nasadíte řešení obsahující databázový projekt do přípravného nebo produkčního prostředí, obvykle nechcete, aby vývojář automatizoval přidávání uživatelských účtů do databázových rolí. Ve většině případů vývojář nebude vědět, které uživatelské účty je potřeba přidat do kterých databázových rolí, a tyto požadavky se můžou kdykoli změnit. Když ale nasadíte řešení obsahující databázový projekt do vývojového nebo testovacího prostředí, je situace obvykle poněkud odlišná:

  • Vývojář obvykle pravidelně nasazuje řešení znovu, často několikrát denně.
  • Databáze se obvykle znovu vytvoří při každém nasazení, což znamená, že uživatelé databáze musí být vytvořeni a přidáni do rolí po každém nasazení.
  • Vývojář má obvykle plnou kontrolu nad cílovým vývojem nebo testovacím prostředím.

V tomto scénáři je často výhodné automaticky vytvářet uživatele databáze a přiřazovat členství v rolích databáze v rámci procesu nasazení.

Klíčovým faktorem je, že tato operace musí být podmíněná na základě cílového prostředí. Pokud nasazujete do přípravného nebo produkčního prostředí, chcete operaci přeskočit. Pokud nasazujete do vývojářského nebo testovacího prostředí, chcete nasadit členství v rolích bez dalšího zásahu. Toto téma popisuje jeden přístup, který můžete použít k řešení tohoto problému.

Toto téma je součástí řady kurzů založených na požadavcích na podnikové nasazení fiktivní společnosti s názvem Fabrikam, Inc. Tato série kurzů používá ukázkové řešení – řešení Contact Manager – k reprezentaci webové aplikace s realistickou úrovní složitosti, včetně aplikace ASP.NET MVC 3, služby Windows Communication Foundation (WCF) a databázového projektu.

Metoda nasazení, která je základem těchto kurzů, je založená na přístupu k rozděleným souborům projektu popsaném v tématu Principy souboru projektu, ve kterém je proces sestavení řízen dvěma soubory projektu – jeden obsahuje pokyny k sestavení, které platí pro každé cílové prostředí, a druhý obsahuje nastavení sestavení a nasazení specifické pro dané prostředí. V době sestavení se soubor projektu pro konkrétní prostředí sloučí do souboru projektu nezávislého na prostředí, aby se vytvořila úplná sada pokynů k sestavení.

Přehled úkolů

V tomto tématu se předpokládá, že:

Pokud chcete vytvářet uživatele databáze a přiřazovat členství v rolích při nasazování databázového projektu do testovacího prostředí, budete muset:

  • Vytvořte skript Transact jazyk SQL (Structured Query Language) (Transact-SQL), který provede potřebné změny databáze.
  • Vytvořte cíl Microsoft Build Engine (MSBuild), který ke spuštění skriptu SQL používá nástroj sqlcmd.exe.
  • Nakonfigurujte soubory projektu tak, aby při nasazování řešení do testovacího prostředí vyvolaly cíl.

V tomto tématu se dozvíte, jak provést každý z těchto postupů.

Skriptování členství v rolích databáze

Skript Jazyka Transact-SQL můžete vytvořit mnoha různými způsoby a v libovolném umístění, které zvolíte. Nejjednodušší je vytvořit skript v rámci řešení v sadě Visual Studio 2010.

Vytvoření skriptu SQL

  1. V okně Průzkumník řešení rozbalte uzel projektu databáze.

  2. Klikněte pravým tlačítkem na složku Scripts , přejděte na Přidat a pak klikněte na Nová složka.

  3. Jako název složky zadejte Test a stiskněte Enter.

  4. Klikněte pravým tlačítkem na složku Test , přejděte na Přidat a potom klikněte na Skript.

  5. V dialogovém okně Přidat novou položku dejte svému skriptu smysluplný název (například AddRoleMemberships.sql) a potom klikněte na Přidat.

    V dialogovém okně Přidat novou položku dejte svému skriptu smysluplný název (například AddRoleMemberships.sql) a potom klikněte na Přidat.

  6. Do souboru AddRoleMemberships.sql přidejte příkazy Jazyka Transact-SQL, které:

    1. Vytvořte uživatele databáze pro přihlášení SQL Server, který bude přistupovat k databázi.
    2. Přidejte uživatele databáze do všech požadovaných databázových rolí.
  7. Soubor by měl vypadat takto:

    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. Soubor uložte.

Spuštění skriptu v cílové databázi

V ideálním případě byste při nasazování databázového projektu spustili všechny požadované skripty Transact-SQL jako součást skriptu po nasazení. Skripty po nasazení ale neumožňují podmíněné spouštění logiky na základě konfigurací řešení nebo vlastností sestavení. Alternativou je spustit skripty SQL přímo ze souboru projektu MSBuild vytvořením prvku Target , který spustí příkaz sqlcmd.exe. Skript můžete spustit v cílové databázi pomocí tohoto příkazu:

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

Poznámka

Další informace o možnostech příkazového řádku sqlcmd najdete v tématu nástroj sqlcmd.

Před vložením tohoto příkazu do cíle nástroje MSBuild je třeba zvážit, za jakých podmínek chcete skript spustit:

  • Před změnou členství v rolích musí cílová databáze existovat. Proto musíte tento skript spustit po nasazení databáze.
  • Musíte zahrnout podmínku, aby se skript spustil pouze pro testovací prostředí.
  • Pokud spouštíte nasazení "co kdyby" – jinými slovy, pokud generujete skripty nasazení, ale ve skutečnosti je nespouštíte – neměli byste skript SQL spouštět.

Pokud používáte přístup k rozděleným souborům projektu popsaný v tématu Vysvětlení souboru projektu, jak ukazuje ukázkové řešení Contact Manageru, můžete rozdělit pokyny k sestavení pro váš skript SQL takto:

  • Všechny požadované vlastnosti specifické pro prostředí spolu s vlastností, která určuje, jestli se mají nasadit oprávnění, by měly být v souboru projektu specifickém pro konkrétní prostředí (například Env-Dev.proj).
  • Samotný cíl nástroje MSBuild spolu s vlastnostmi, které se nebudou měnit mezi cílovými prostředími, by měl být v souboru univerzálního projektu (například Publish.proj).

V souboru projektu specifickém pro konkrétní prostředí je potřeba definovat název databázového serveru, název cílové databáze a logickou vlastnost, která uživateli umožňuje určit, zda se má nasadit členství v rolích.

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

V souboru univerzálního projektu musíte zadat umístění spustitelného souboru sqlcmd a umístění skriptu SQL, který chcete spustit. Tyto vlastnosti zůstanou stejné bez ohledu na cílové prostředí. K provedení příkazu sqlcmd je také potřeba vytvořit cíl nástroje 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>

Všimněte si, že jako statickou vlastnost přidáte umístění spustitelného souboru sqlcmd, protože to může být užitečné pro jiné cíle. Naproti tomu definujete umístění skriptu SQL a syntaxi příkazu sqlcmd jako dynamické vlastnosti v rámci cíle, protože před spuštěním cíle nebudou vyžadovány. V tomto případě se cíl DeployTestDBPermissions spustí pouze v případě, že jsou splněny tyto podmínky:

  • Vlastnost DeployTestDBRoleMemberships je nastavená na true.
  • Uživatel nezadá příznak WhatIf=true .

Nakonec nezapomeňte vyvolat cíl. V souboru Publish.proj to můžete provést přidáním cíle do seznamu závislostí pro výchozí cíl FullPublish . Musíte zajistit, aby se cíl DeployTestDBPermissions nespustí, dokud se nespustí cíl 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>

Závěr

Toto téma popisuje jeden způsob, jak můžete přidat uživatele databáze a členství v rolích jako akci po nasazení při nasazení databázového projektu. To je obvykle užitečné, když pravidelně znovu vytváříte databázi v testovacím prostředí, ale obvykle byste se tomu měli vyhnout, když nasazujete databáze do přípravných nebo produkčních prostředí. Proto byste se měli ujistit, že používáte nezbytnou podmíněnou logiku, aby se uživatelé databáze a členství v rolích vytvářeli jenom tehdy, když je to vhodné.

Další čtení

Další informace o nasazení databázových projektů pomocí VSDBCMD najdete v tématu Nasazení databázových projektů. Pokyny k přizpůsobení nasazení databáze pro různá cílová prostředí najdete v tématu Přizpůsobení nasazení databáze pro více prostředí. Další informace o řízení procesu nasazení pomocí vlastních souborů projektu MSBuild najdete v tématech Principy souboru projektu a Principy procesu sestavení. Další informace o možnostech příkazového řádku sqlcmd najdete v tématu nástroj sqlcmd.