Udostępnij za pośrednictwem


Wdrażanie członkostw ról bazy danych w środowiskach testowych

Autor: Jason Lee

W tym temacie opisano sposób dodawania kont użytkowników do ról bazy danych w ramach wdrożenia rozwiązania w środowisku testowym.

Podczas wdrażania rozwiązania zawierającego projekt bazy danych w środowisku przejściowym lub produkcyjnym zwykle nie chcesz, aby deweloper automatyzować dodawanie kont użytkowników do ról bazy danych. W większości przypadków deweloper nie będzie wiedział, które konta użytkowników muszą zostać dodane do ról bazy danych, a te wymagania mogą ulec zmianie w dowolnym momencie. Jednak podczas wdrażania rozwiązania zawierającego projekt bazy danych w środowisku projektowym lub testowym sytuacja jest zwykle zupełnie inna:

  • Deweloper zwykle regularnie wdraża rozwiązanie, często kilka razy dziennie.
  • Baza danych jest zwykle tworzona ponownie w każdym wdrożeniu, co oznacza, że użytkownicy bazy danych muszą zostać utworzeni i dodani do ról po każdym wdrożeniu.
  • Deweloper zwykle ma pełną kontrolę nad docelowym środowiskiem projektowym lub testowym.

W tym scenariuszu często korzystne jest automatyczne tworzenie użytkowników bazy danych i przypisywanie członkostwa w rolach bazy danych w ramach procesu wdrażania.

Kluczowym czynnikiem jest to, że ta operacja musi być warunkowa na podstawie środowiska docelowego. Jeśli wdrażasz w środowisku przejściowym lub produkcyjnym, chcesz pominąć operację. Jeśli wdrażasz w środowisku dewelopera lub środowiska testowego, chcesz wdrożyć członkostwo w rolach bez dalszej interwencji. W tym temacie opisano jedno podejście, którego można użyć do rozwiązania tego wyzwania.

Ten temat stanowi część serii samouczków opartych na wymaganiach dotyczących wdrażania przedsiębiorstwa fikcyjnej firmy o nazwie Fabrikam, Inc. W tej serii samouczków użyto przykładowego rozwiązania — rozwiązania Contact Manager — do reprezentowania aplikacji internetowej o realistycznym poziomie złożoności, w tym aplikacji ASP.NET MVC 3, usługi Windows Communication Foundation (WCF) i projektu bazy danych.

Metoda wdrażania w centrum tych samouczków jest oparta na metodzie podzielonego pliku projektu opisanego w artykule Understanding the Project File (Opis pliku projektu), w którym proces kompilacji jest kontrolowany przez dwa pliki projektu — jeden zawierający instrukcje kompilacji, które mają zastosowanie do każdego środowiska docelowego, oraz jeden zawierający ustawienia kompilacji i wdrażania specyficzne dla środowiska. W czasie kompilacji plik projektu specyficzny dla środowiska jest scalony z plikiem projektu niezależnego od środowiska w celu utworzenia pełnego zestawu instrukcji kompilacji.

Omówienie zadań

W tym temacie założono, że:

Aby utworzyć użytkowników bazy danych i przypisać członkostwo w rolach podczas wdrażania projektu bazy danych w środowisku testowym, należy wykonać następujące kroki:

  • Utwórz skrypt transact Structured Query Language (Transact-SQL), który wprowadza niezbędne zmiany bazy danych.
  • Utwórz obiekt docelowy Microsoft Build Engine (MSBuild), który używa narzędzia sqlcmd.exe do uruchamiania skryptu SQL.
  • Skonfiguruj pliki projektu, aby wywoływać obiekt docelowy podczas wdrażania rozwiązania w środowisku testowym.

W tym temacie pokazano, jak wykonać każdą z tych procedur.

Wykonywanie skryptów członkostwa w rolach bazy danych

Skrypt języka Transact-SQL można utworzyć na wiele różnych sposobów i w dowolnej wybranej lokalizacji. Najprostszym podejściem jest utworzenie skryptu w rozwiązaniu w programie Visual Studio 2010.

Aby utworzyć skrypt SQL

  1. W oknie Eksplorator rozwiązań rozwiń węzeł projektu bazy danych.

  2. Kliknij prawym przyciskiem myszy folder Skrypty , wskaż polecenie Dodaj, a następnie kliknij pozycję Nowy folder.

  3. Wpisz Test jako nazwę folderu, a następnie naciśnij klawisz Enter.

  4. Kliknij prawym przyciskiem myszy folder Test , wskaż polecenie Dodaj, a następnie kliknij pozycję Skrypt.

  5. W oknie dialogowym Dodawanie nowego elementu nadaj skryptowi zrozumiałą nazwę (na przykład AddRoleMemberships.sql), a następnie kliknij przycisk Dodaj.

    W oknie dialogowym Dodawanie nowego elementu nadaj skryptowi zrozumiałą nazwę (na przykład AddRoleMemberships.sql), a następnie kliknij przycisk Dodaj.

  6. W pliku AddRoleMemberships.sql dodaj instrukcje Języka Transact-SQL, które:

    1. Utwórz użytkownika bazy danych dla identyfikatora logowania SQL Server, który będzie uzyskiwać dostęp do bazy danych.
    2. Dodaj użytkownika bazy danych do dowolnych wymaganych ról bazy danych.
  7. Plik powinien wyglądać podobnie do następującego:

    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. Zapisz plik.

Wykonywanie skryptu w docelowej bazie danych

W idealnym przypadku podczas wdrażania projektu bazy danych należy uruchamiać wszystkie wymagane skrypty języka Transact-SQL w ramach skryptu po wdrożeniu. Skrypty po wdrożeniu nie umożliwiają jednak warunkowego wykonywania logiki na podstawie konfiguracji rozwiązania ani właściwości kompilacji. Alternatywą jest uruchomienie skryptów SQL bezpośrednio z pliku projektu MSBuild przez utworzenie elementu docelowego , który wykonuje polecenie sqlcmd.exe. To polecenie służy do uruchamiania skryptu w docelowej bazie danych:

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

Uwaga

Aby uzyskać więcej informacji na temat opcji wiersza polecenia sqlcmd, zobacz narzędzie sqlcmd.

Przed osadzeniem tego polecenia w docelowym programie MSBuild należy wziąć pod uwagę warunki, w których skrypt ma zostać uruchomiony:

  • Docelowa baza danych musi istnieć przed zmianą jego członkostwa w rolach. W związku z tym należy uruchomić ten skrypt po wdrożeniu bazy danych.
  • Należy dołączyć warunek, aby skrypt był wykonywany tylko dla środowisk testowych.
  • Jeśli uruchamiasz wdrożenie "co jeśli", innymi słowy, jeśli generujesz skrypty wdrażania, ale nie uruchamiasz ich w rzeczywistości, nie należy uruchamiać skryptu SQL.

Jeśli używasz metody podzielonego pliku projektu opisanego w temacie Understanding the Project File (Opis pliku projektu), jak pokazano w przykładowym rozwiązaniu Contact Manager, możesz podzielić instrukcje kompilacji dla skryptu SQL w następujący sposób:

  • Wszystkie wymagane właściwości specyficzne dla środowiska wraz z właściwością, która określa, czy należy wdrożyć uprawnienia, powinny znajdować się w pliku projektu specyficznym dla środowiska (na przykład Env-Dev.proj).
  • Obiekt docelowy programu MSBuild wraz z wszelkimi właściwościami, które nie zmienią się między środowiskami docelowymi, powinny znajdować się w pliku projektu uniwersalnego (na przykład Publish.proj).

W pliku projektu specyficznym dla środowiska należy zdefiniować nazwę serwera bazy danych, docelową nazwę bazy danych i właściwość logiczną, która umożliwia użytkownikowi określenie, czy mają zostać wdrożone członkostwa w rolach.

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

W pliku projektu uniwersalnego należy podać lokalizację pliku wykonywalnego sqlcmd i lokalizację skryptu SQL, który chcesz uruchomić. Te właściwości pozostaną takie same niezależnie od środowiska docelowego. Należy również utworzyć obiekt docelowy programu MSBuild, aby wykonać polecenie sqlcmd.

<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>

Zwróć uwagę, że lokalizację pliku wykonywalnego sqlcmd można dodać jako właściwość statyczną, ponieważ może to być przydatne dla innych obiektów docelowych. Natomiast należy zdefiniować lokalizację skryptu SQL i składnię polecenia sqlcmd jako właściwości dynamiczne w obiekcie docelowym, ponieważ nie będą wymagane przed wykonaniem obiektu docelowego. W takim przypadku obiekt docelowy DeployTestDBPermissions zostanie wykonany tylko wtedy, gdy spełnione są następujące warunki:

  • Właściwość DeployTestDBRoleMemberships ma wartość true.
  • Użytkownik nie określił flagi WhatIf=true .

Na koniec nie zapomnij wywołać obiektu docelowego. W pliku Publish.proj możesz to zrobić, dodając element docelowy do listy zależności dla domyślnego elementu docelowego FullPublish . Należy upewnić się, że element docelowy DeployTestDBPermissions nie jest wykonywany do momentu wykonania obiektu docelowego 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>

Podsumowanie

W tym temacie opisano jeden ze sposobów dodawania użytkowników bazy danych i członkostwa w rolach jako akcji po wdrożeniu podczas wdrażania projektu bazy danych. Jest to zwykle przydatne podczas regularnego ponownego tworzenia bazy danych w środowisku testowym, ale zwykle należy unikać wdrażania baz danych w środowiskach przejściowych lub produkcyjnych. W związku z tym należy upewnić się, że używasz niezbędnej logiki warunkowej, aby użytkownicy bazy danych i członkostwo w rolach były tworzone tylko wtedy, gdy jest to odpowiednie.

Dalsze informacje

Aby uzyskać więcej informacji na temat wdrażania projektów bazy danych przy użyciu usługi VSDBCMD, zobacz Wdrażanie projektów bazy danych. Aby uzyskać wskazówki dotyczące dostosowywania wdrożeń baz danych dla różnych środowisk docelowych, zobacz Dostosowywanie wdrożeń bazy danych dla wielu środowisk. Aby uzyskać więcej informacji na temat używania niestandardowych plików projektu MSBuild do kontrolowania procesu wdrażania, zobacz Understanding the Project File and Understanding the Build Process (Opis pliku projektu i Opis procesu kompilacji). Aby uzyskać więcej informacji na temat opcji wiersza polecenia sqlcmd, zobacz narzędzie sqlcmd.