比較資料庫和專案
適用於:Microsoft Fabric 中的 SQL ServerAzure SQL 資料庫 Azure SQL 受控執行個體 SQL 資料庫
了解資料庫與 SQL 專案之間的物件定義差異,可以提供對資料庫和專案狀態的寶貴見解,包括在持續開發或迴歸疑難排解期間。 SQL 專案包括用於視覺化差異的工具、分析更新資料庫所需的變更、將資料庫變更匯入 SQL 專案檔集,以及檢閱為更新資料庫以符合專案而執行的 T-SQL 指令碼。
本文章會檢閱使用不同方法比較資料庫和 SQL 專案的方法:
- 您可以使用結構描述比較,視覺化資料庫和/或專案之間的差異。 此比較可協助您識別資料庫與專案之間需要同步處理的變更。
- 您可以使用部署報表來摘要說明和自動檢閱更新資料庫所需的變更。
- 您可以使用結構描述比較或 SqlPackage 擷取,將資料庫變更匯入 SQL 專案檔集。
- 您可以使用 SqlPackage 部署指令碼或結構描述比較來檢閱為更新資料庫以符合專案而執行的 T-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