共用方式為


SQL 專案的擴充性

.NET 資料層應用程式架構 (DacFx) 程式庫提供可用來修改資料庫專案建置和部署動作行為的擴充點。

  • Build (BuildContributor): 當 SQL 專案在專案模型完全驗證之後建置時,就會執行這種類型的擴充功能。 除了建置工作的所有屬性和所有自訂引數之外,建置參與者也可以存取整個模型。
  • Deploy (DeploymentPlanModifier): 當 SQL 專案部署為部署管線的一部分時,會在產生部署計劃之後,但在執行部署計劃之前,執行這種類型的擴充功能。 您可以使用 DeploymentPlanModifier 透過加入或移除步驟修改部署計畫。 部署參與者可以存取部署計畫、比較結果,以及來源和目標模型。
  • 部署 (DeploymentPlanExecutor):此類擴展在部署計畫執行時運行,並提供對部署計畫的唯讀存取。 DeploymentPlanExecutor 會根據部署計畫來執行動作。

擴充性案例範例

您可以實現組建或部署貢獻者以實現下列範例情境:

  • 專案建置期間產生結構描述文件 - 若要支援這個案例,請實作 BuildContributor 並覆寫 OnExecute 方法以產生結構描述文件。 您可以建立目標檔案,定義可控制擴充功能是否執行及指定輸出檔名稱的預設引數。
  • 當部署 SQL 專案時產生差異報表 - 若要支援這個案例,請實作 DeploymentPlanExecutor,以便在部署 SQL 專案時產生 XML 檔案。
  • 修改部署計畫以更改資料移動的時間 - 若要支援此情境,請實作 DeploymentPlanModifier 並且遍歷部署計畫。 在該計畫中的每個 SqlTableMigrationStep,檢查比較結果以決定是否要執行或跳過該步驟。
  • 將檔案複製到部署 SQL 專案時產生的 dacpac - 若要支援這個案例,請實作部署參與者並覆寫 OnEstablishDeploymentConfiguration 方法,以指定由專案系統標示為 DeploymentExtensionConfiguration 的檔案。 這些檔案應複製到輸出資料夾並加入至產生的 dacpac 內部。 您也可以修改參與者,將多個檔案合併至一個新檔案,以便複製到輸出資料夾並加入至部署資訊清單。 在部署期間,您可以實作 OnApplyDeploymentConfiguration 方法,從 dacpac 擷取那些檔案並準備檔案使用於 OnExecute 方法。

參與者可以在運行時間接受輸入做為名稱/值自變數組。 這些引數可讓終端使用者在建置或部署時自訂參與者的行為。 例如,您可以讓使用者指定輸入或輸出檔的名稱,或控制模型中物件的選擇。

部署參與者

SQL 專案的部署程序透過部署參與者支援擴充性,部署參與者可存取部署計劃,也可以進行修改 (DeploymentPlanModifier),或根據計劃實作動作 (DeploymentPlanExecutor)。 部署參與者可以存取部署計畫、比較結果,以及來源和目標模型。 透過 DeploymentPlanModifier,您可以使用部署參與者從部署計劃新增或移除步驟,或修改部署計劃中的步驟。 DeploymentPlanModifiers 是最常使用的部署參與者。

DacFx 部署程序的螢幕擷取畫面,其中部署計劃根據模型差異計算出來,並由部署參與者修改。

部署參與者可透過參數化重複使用,並可用於多重專案。 除了 DacExtensions 的封存範例之外,社群成員創建並分享自己的可重複使用的部署元件作為開放原始碼專案。

SqlPackage 整合

SqlPackage 是命令行公用程式,可用來建立和部署 SQL 專案。 與 SqlPackage 搭配使用時,部署參與者會自定義發佈程式,而且可以使用發佈動作上的屬性來指定,例如 /p:AdditionalDeploymentContributors。 部署參與者必須位於 SqlPackage 可存取的位置,例如與 SqlPackage 可執行檔相同的資料夾,或在屬性 /p:AdditionalDeploymentContributorPaths中指定的資料夾中。 如需發佈動作和可用來指定部署參與者的屬性詳細資訊,請參閱 SqlPackage Publish

部署參與者在某些情況下必須使用與 SqlPackage 相同的 DacFx 程式庫主要版本來建置。

  • 使用 .NET Framework 版本的 SqlPackage,這需要與部署參與者的主要版本相符。
  • SqlPackage 更新至已修改的 DacFx 函式庫 API 定義時,會隨著版本的不同而改變。 重大變更僅限於主要版本更新。

如果未使用相容版本的 DacFx 建置部署參與者,則在運行時嘗試載入擴充功能時,SqlPackage 作業將會失敗。 當部署參與者無法載入 SqlPackage 時,您會看到類似下列訊息的錯誤訊息:

Could not load extensions from file 'D:\a\_work\....dll' because the assembly has dependency to older versions of DacFx. For more information check https://aka.ms/sqlprojects-extensions

Error SQL0: Required contributor with id 'MyCompany.MyExtension' could not be loaded.
System.Management.Automation.RemoteException
Contributor initialization error.

在自動化管線中整合部署參與者與 SqlPackage 時,請考慮管理在組建代理程式上安裝的 SqlPackage 版本。 管理 SqlPackage 安裝可讓您確保它符合用來建置部署開發項目的 DacFx 程式庫版本。 若要獲得更大的彈性,請使用 dotnet 工具 Microsoft.SqlPackage ,而不是 .NET Framework SqlPackage。 如需瞭解在無法修改環境的情況下,如何在工作流程中安裝 SqlPackage 的詳細資訊,請參閱《開發管線中的 SqlPackage》一文。