資料層應用程式 (DAC) 是整個資料庫模型的獨立單位,而且可在稱為 DAC 封裝的成品中移植,或 .dacpac
。 在將 .dacpac
部署到生產環境之前,最佳做法是先檢查其內容,並且在升級現有的 DAC 之前驗證升級動作。 部署非貴組織開發的套件時,驗證.dacpac
內容特別重要。 本文說明數種從 .dacpac
解開適用於 Windows、macOS 和 Linux 的資料庫模型的方法。
警告
我們建議您不要從未知或不受信任的來源部署 .dacpac
。 這類 DAC 可能包含惡意程式碼,因此可能會執行非預期的程式碼,或是修改結構描述而造成錯誤。 在您使用來源不明或來源不受信任的 DAC 之前,請將它部署到資料庫引擎的隔離測試執行個體、解除封裝 DAC 並檢查程式碼,例如預存程序或其他使用者定義的程式碼。
檢視 .dacpac
內容的選項包括:
- 在 Visual Studio 中將
.dacpac
匯入至 SQL 專案 - 使用 SqlPackage 命令行公用程式來擷取
.dacpac
- 解壓縮檔案以檢視 XML 內容
- 正在將
.dacpac
部署到測試實例
在從資料庫擷取物件定義之後立即解除封裝 .dacpac
,即可更有效率地使用 SqlPackage 中的 Extract 搭配 屬性 /p:ExtractTarget=File
來完成。 結果會直接建立單 .sql
一檔案,其中包含來自指定源資料庫的物件定義。
將 DACPAC 匯入 Visual Studio 中的 SQL 專案
將 .dacpac
匯入 Visual Studio 中的 SQL 專案,會導致將 的內容 .dacpac
轉換成 .sql 檔案,並組織成資料夾。 在匯入之後,方案總管中會顯示 來自 .dacpac
的部署後腳本和預先部署腳本。
將 SQL Server Data Tools 安裝作為 Visual Studio 的一部分,並建立新的 SQL 專案。
在方案總管中滑鼠右鍵按一下空白專案,然後選取 [匯入],再選取 [從資料層應用程式封裝]。
解壓縮 DACPAC 以檢視 XML 內容
解壓縮 .dacpac
檔案會導致原始 XML 內容可供在文字編輯器中檢視。 在 中 .dacpac
尋找特定元件時,檢閱 XML 內容可以是存取資訊的快速方法。
將檔案上的
.dacpac
延伸名變更為.zip
。使用作業系統所提供的公用程式,將 ZIP 檔案解壓縮。 若要透過命令列解壓縮檔案:
unzip AdventureWorks.dacpac
產生的內容包含
DacMetadata.xml
、Origin.xml
和model.xml
。
將 DACPAC 部署至測試實例
.dacpac
部署到測試實例後,會導致 .dacpac
的內容發佈到資料庫中,讓物件可以從各種連接的資料庫工具中瀏覽。
備註
在本機建立測試執行個體的其中一個選項是使用 Docker 中的 SQL Server。
使用 Azure Data Studio 部署 DACPAC
在 Azure Data Studio 中安裝 SQL Server dacpac 延伸模組。
連線至想要的執行個體。 以滑鼠右鍵按一下伺服器節點,並從功能表選取 [資料層應用程式精靈]。
從精靈選取 [部署] 選項,並將 [目標資料庫] 選項設定為 [新資料庫]。
在部署後,請開啟物件總管,連接到伺服器上的資料庫,以便檢視資料庫物件。
使用 SqlPackage 部署 DACPAC
安裝 SqlPackage。
使用 SqlPackage CLI 將
.dacpac
檔案發佈至所需的實例。 如需將 發行.dacpac
至資料庫的範例命令,請參閱 SqlPackage 發佈範例。
具有 DACPAC 部署功能的其他工具
除了 Azure Data Studio 和 SqlPackage 之外,許多其他工具都可以用來將 部署 .dacpac
至資料庫。 一些範例包括:
- SQL Server Management Studio
- Visual Studio:SQL Server Data Tools
叫用 Unpack()
方法
Microsoft.SqlServer.DacFx .NET API 提供將 解壓縮.dacpac
至資料夾的方法,可用來以程式設計方式將 解壓縮.dacpac
至資料夾。 下列範例 .NET 應用程式會採用兩個自變數:檔案的路徑 .dacpac
和輸出資料夾的路徑,而結果是轉換成3個 XML 檔案的內容 .dacpac
,以及包含所有資料庫物件的單一.sql檔案。
using Microsoft.SqlServer.Dac;
namespace DacUnpack
{
class Program
{
static void Main(string[] args)
{
var dacpacPath = args[0];
var outputPath = args[1];
if (!Directory.Exists(outputPath))
{
Directory.CreateDirectory(outputPath);
}
Console.WriteLine("Unpacking {0} to {1}", dacpacPath, outputPath);
using(DacPackage dacpac = DacPackage.Load(dacpacPath))
{
dacpac.Unpack(outputPath);
}
}
}
}