將資料庫角色成員資格部署到測試環境

作者 :Jason Lee

本主題描述如何將使用者帳戶新增至資料庫角色,作為測試環境解決方案部署的一部分。

當您將包含資料庫專案的解決方案部署到預備或生產環境時,您通常不希望開發人員將使用者帳戶新增至資料庫角色自動化。 在大部分情況下,開發人員不會知道哪些使用者帳戶需要新增至哪個資料庫角色,而且這些需求可以隨時變更。 不過,當您將包含資料庫專案的解決方案部署到開發或測試環境時,情況通常不同:

  • 開發人員通常會定期重新部署解決方案,通常是一天數次。
  • 資料庫通常會在每個部署上重新建立,這表示資料庫使用者必須在每次部署之後建立並新增至角色。
  • 開發人員通常完全控制目標開發或測試環境。

在此案例中,自動建立資料庫使用者,並在部署過程中指派資料庫角色成員資格通常很有説明。

關鍵因素是,此作業必須根據目標環境有條件。 如果您要部署至預備環境或生產環境,您想要略過作業。 如果您要部署至開發人員或測試環境,您想要部署角色成員資格,而不需進一步介入。 本主題描述一種可用來解決這項挑戰的方法。

本主題以名為 Fabrikam, Inc 的虛構公司企業部署需求為基礎,形成一系列教學課程的一部分。本教學課程系列使用範例解決方案連絡人 管理員解決方案來代表具有實際複雜程度的 Web 應用程式,包括 ASP.NET MVC 3 應用程式、Windows Communication Foundation (WCF) 服務和資料庫專案。

這些教學課程的核心部署方法是以 瞭解專案檔中所述的分割專案檔方法為基礎,其中建置程式是由兩個專案檔控制,一個包含適用于每個目的地環境的建置指示,另一個包含環境特定的組建和部署設定。 在建置階段,環境特定的專案檔會合並到與環境無關的專案檔中,以形成一組完整的建置指示。

工作概觀

本主題假設:

  • 您可以使用分割專案檔方法來部署方案,如 瞭解專案檔中所述。
  • 您可以從專案檔呼叫 VSDBCMD 來部署資料庫專案,如 瞭解建置程式中所述。

若要在將資料庫專案部署至測試環境時建立資料庫使用者並指派角色成員資格,您必須:

  • 建立 Transact 結構化查詢語言 (SQL) (Transact-SQL) 腳本,以進行必要的資料庫變更。
  • 建立Microsoft Build Engine (MSBuild) 目標,以使用 sqlcmd.exe 公用程式來執行 SQL 腳本。
  • 設定專案檔,以在您將方案部署到測試環境時叫用目標。

本主題將說明如何執行這些程式。

編寫資料庫角色成員資格的腳本

您可以使用許多不同的方式,以及您選擇的任何位置來建立 Transact-SQL 腳本。 最簡單的方法是在 Visual Studio 2010 的方案中建立腳本。

若要建立 SQL 腳本

  1. [方案總管] 視窗中,展開您的資料庫專案節點。

  2. 以滑鼠右鍵按一下 [腳本 ] 資料夾,指向 [ 新增],然後按一下 [ 新增資料夾]。

  3. 輸入 Test 作為資料夾名稱,然後按 Enter。

  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 腳本。 不過,部署後腳本不允許根據解決方案組態或建置屬性有條件地執行邏輯。 替代方法是建立執行 sqlcmd.exe 命令的 Target 元素,直接從 MSBuild 專案檔執行 SQL 腳本。 您可以使用此命令在目標資料庫上執行腳本:

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

注意

如需 sqlcmd 命令列選項的詳細資訊,請參閱 sqlcmd 公用程式

在 MSBuild 目標中內嵌此命令之前,您需要考慮腳本要執行的情況:

  • 您必須先存在目標資料庫,才能變更其角色成員資格。 因此,您必須在資料庫部署 之後 執行此腳本。
  • 您需要包含條件,以便只針對測試環境執行腳本。
  • 如果您正在執行「假設」部署,換句話說,如果您要產生部署腳本,但未實際執行部署腳本,則不應該執行 SQL 腳本。

如果您使用 瞭解專案檔中所述的分割專案檔方法,如 Contact Manager 範例解決方案所示,您可以分割 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 腳本位置。 不論目的地環境為何,這些屬性都會維持不變。 您也需要建立 MSBuild 目標以執行 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>

請注意,您會將 sqlcmd 可執行檔的位置新增為靜態屬性,因為這可能會對其他目標很有用。 相反地,您會將 SQL 腳本的位置和 sqlcmd 命令的語法定義為目標內的動態屬性,因為執行目標之前不需要這些屬性。 在此情況下,只有在符合這些條件時, 才會執行 DeployTestDBPermissions 目標:

  • DeployTestDBRoleMemberships屬性設定為true
  • 使用者尚未指定 WhatIf=true 旗標。

最後,別忘了叫用目標。 在 Publish.proj 檔案中,您可以將目標新增至預設 FullPublish 目標的相依性清單來執行此動作。 您必須確保在執行 PublishDbPackages目標之前,不會執行DeployTestDBPermissions目標。

<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 公用程式