共用方式為


比較資料庫和專案

適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 SQL 資料庫

了解資料庫與 SQL 專案之間的物件定義差異,可以提供對資料庫和專案狀態的寶貴見解,包括在持續開發或迴歸疑難排解期間。 SQL 專案包括用於視覺化差異的工具、分析更新資料庫所需的變更、將資料庫變更匯入 SQL 專案檔集,以及檢閱為更新資料庫以符合專案而執行的 T-SQL 指令碼。

本文章會檢閱使用不同方法比較資料庫和 SQL 專案的方法:

結構描述比較:視覺化差異

必要條件

Visual Studio 中,SDK 樣式 SQL 專案 (預覽版) 中尚不提供圖形架構比較。 使用 Azure Data Studio 或 Visual Studio 來比較結構描述。

結構描述比較需要圖形化工具,例如 Visual Studio 或 Azure Data Studio。

摘要

結構描述比較提供視覺上最豐富的介面,讓您了解資料庫與專案之間的差異。 結構描述比較的主要功能是比較的方向性是可逆的。 因此,您可以使用結構描述比較來了解要部署到資料庫的專案變更,或從資料庫變更以新增至專案。 您可以使用結構描述比較來識別物件定義中的差異,例如資料表、檢視、預存程序和函式。

完整的差異集或選取的子集可用於將變更套用至資料庫或專案。 結構描述比較也可以產生部署指令碼,在執行時,有效地將變更套用至資料庫。

結構描述比較概觀中深入了解結構描述比較。

部署報告:檢閱變更

部署報表需要 SqlPackage CLI。

dotnet tool install -g Microsoft.SqlPackage

摘要

部署報表會提供更新資料庫以符合專案所需的變更摘要。 SqlPackage CLI 會藉由比較來源模型 (.dacpac SQL 專案組建成品或資料庫) 與目標資料庫來產生部署報表。 例如,下列命令會從名為 MyProject 的 SQL 專案產生名為 MyDatabase 的資料庫部署報表:

dotnet build MyProject.sqlproj
sqlpackage /Action:deployreport /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /OutputPath:deployreport.xml

產生的 XML 是部署計劃的簡化形式,摘要說明了執行資料庫部署時要執行的作業。 下列作業清單並不詳盡:

  • Create
  • Alter
  • Drop
  • Refresh
  • UnbindSchemaBinding
  • UnbindFulltextIndex
  • TableDataMotion
  • SPRename
  • EnableChangeTrackingDatabase
  • DisableChangeTrackingDatabase

您可以在文字編輯器或 Visual Studio 中檢閱部署報表,其外觀類似於以下內容:

<?xml version="1.0" encoding="utf-8"?>
<DeploymentReport xmlns="http://schemas.microsoft.com/sqlserver/dac/DeployReport/2012/02">
    <Alerts />
    <Operations>
        <Operation Name="Create">
            <Item Value="[CO].[Products].[IX_Products_CategorySlug]" Type="SqlIndex" />
        </Operation>
        <Operation Name="Alter">
            <Item Value="[CO].[Brands]" Type="SqlTable" />
            <Item Value="[CO].[AddProductImage]" Type="SqlProcedure" />
        </Operation>
        <Operation Name="Refresh">
            <Item Value="[CO].[SelectStarView]" Type="SqlView" />
        </Operation>
    </Operations>
</DeploymentReport>

部署報表可用來檢閱變更,以及監視潛在的強烈影響事件,例如資料移動或叢集索引建立/捨棄。 這些事件會列在 Alerts 元素下的部署報表中。

部署報表 XML 作業的優點是可用於自動檢閱更新資料庫所需的變更。 可以剖析 XML 並用來產生報告,或根據列出的作業或物件名稱觸發警示。

從資料庫匯入變更

結構描述比較一節所述,結構描述比較可用於將資料庫的變更套用至 SQL 專案檔集。 當您有一個直接主動開發的資料庫並且 SQL 專案用於管理原始檔控制中的資料庫物件時,將變更套用到 SQL 專案是常見的案例。 透過 Visual Studio 或 Azure Data Studio 手動完成這項作業可能很耗時,特別是當資料庫有許多物件或零星變更時。 在本節中,我們會檢閱如何將自動從資料庫擷取物件定義擷取到 SQL 專案檔集。

必要條件

我們著眼於自動化,利用 SqlPackage CLI 將資料庫的物件定義擷取到 SQL 專案檔集。 Microsoft.Build.Sql.Templates .NET 範本可用於建立 SQL 專案檔,這是可選的步驟。

# install SqlPackage CLI
dotnet tool install -g Microsoft.SqlPackage

# install Microsoft.Build.Sql.Templates
dotnet new install Microsoft.Build.Sql.Templates

摘要

SqlPackage 擷取命令會採用來源資料庫,並產生輸出資料庫模型,作為 .dacpac 檔案或作為一組 SQL 指令碼。 SqlPackage 預設會產生 .dacpac 檔案,但 /p:ExtractTarget= 屬性可用來指定一組 SQL 指令碼。 下列命令會將資料庫 MyDatabase 擷取到資料夾 MyDatabaseProject 中的 SQL 專案檔中:

sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType

當資料夾位於原始檔控制之下時,擷取的物件定義會顯示原始檔控制工具中的差異。 藉由使用 SqlPackage 產生檔案並檢查原始檔控制中的差異,您可以自動化從資料庫將變更匯入 SQL 專案檔集的程序。

在一連串三個命令中,我們可以移除先前的檔案集、擷取資料庫,以及檢查原始檔控制工具中的差異:

rm -rf MyDatabaseProject
sqlpackage /Action:Extract /SourceConnectionString:{connection string for MyDatabase} /TargetFile:MyDatabaseProject /p:ExtractTarget=SchemaObjectType
git status --porcelain | wc -l

我們的輸出是最新 SqlPackage 擷取所變更的檔案數目。 git status 命令的輸出可用於觸發其他自動化步驟。 如果我們想要使用此組檔案作為 SQL 專案,可以使用 Microsoft.Build.Sql.Templates .NET 範本,在資料夾 MyDatabaseProject 中建立 SQL 專案檔:

dotnet new sqlproj -n MyDatabaseProject -o MyDatabaseProject

檢閱部署 T-SQL 指令碼

結構描述比較一節中所述,結構描述比較可用來產生更新資料庫以符合 SQL 專案所需的 T-SQL 指令碼。 在本節中,我們會檢閱如何使用 SqlPackage,自動化產生更新資料庫所需的 T-SQL 指令碼,以符合 SQL 專案,使其可以儲存為管線成品以供檢閱和核准。

必要條件

dotnet tool install -g Microsoft.SqlPackage

摘要

藉助 SqlPackage 執行 SQL 專案部署會使用發佈動作,但如果我們想要檢閱執行的 T-SQL 指令碼,則可以使用指令碼動作。 下列命令會產生更新名為 MyDatabase 的資料庫,以符合名為的 MyProject 的 SQL 專案所需的 T-SQL 指令碼:

dotnet build MyProject.sqlproj
sqlpackage /Action:Script /SourceFile:bin/Debug/MyProject.dacpac /TargetConnectionString:{connection string for MyDatabase} /DeployScriptPath:Deployment.sql