在本文中,您將學習如何透過 Visual Studio Code 中的 SQL 資料庫專案來建模與部署跨倉庫相依關係。 你可以從兩個現有的倉庫專案開始,透過資料庫參考以及必要時的 部署前和部署後腳本,設定它們之間的單向相依關係。
本文基於在 Visual Studio Code 中開發資料倉庫專案的概念,並假設你已經熟練掌握了建立和發布單一資料倉庫專案的能力。
先決條件
開始之前,請確定您:
- 在同一工作區建立 兩個布料倉庫 。
- 要建立新的樣本倉庫,請參見 在 Microsoft Fabric 建立樣本倉庫。
- 在 Visual Studio Code 中為每個倉庫建立或擷取一個
database 專案 。 - 若要為現有倉庫或新倉庫建立資料庫專案,請參見開發倉庫專案,Visual Studio Code。
- 在你的工作站上安裝 Visual Studio Code。
- 安裝 .NET SDK 以建立並發佈資料庫專案。
- 安裝兩個Visual Studio Code擴充功能:SQL Database Projects 以及 SQL Server (mssql)。
- 你可以直接在 Visual Studio Code 市集內搜尋「SQL Database Projects」或「SQL Server (mssql)」來安裝所需的擴充功能。
- 倉庫專案會驗證、建置,並可發佈於 Visual Studio Code 中。
備註
本文聚焦於 Visual Studio Code 中的
本文 不涵蓋Lakehouse 的 SQL 分析端點的跨倉庫開發。 Lakehouse 資料表和 SQL 分析端點物件在原始碼控制中不會像倉庫專案那樣被追蹤。 使用 Warehouse 項目搭配資料庫專案,完整整合 git 與部署,支援 Fabric 原生體驗與客戶端工具。
情境:Zava Analytics 跨域倉庫
Zava Analytics 使用兩個商業領域:
- 銷售 ——客戶訂單、營收及管線指標。
- 行銷 ——活動、通路與互動指標。
每個領域具備:
同一工作區的 布料倉庫 :
ZavaSalesWarehouseZavaMarketingWarehouse
在 Visual Studio Code 中的 資料庫專案:
Zava.Sales.WarehouseZava.Marketing.Warehouse
為了建立端對端的 ELT 與報告,每個網域都需要 唯讀檢視 以存取另一個網域的資料:
-
Sales需要顧客參與行銷活動。 -
Marketing需要根據活動來獲得銷售表現數據。
您需要:
- 透過資料庫參考建立 單向跨倉庫相依 關係。
- 避免循環依賴。
確保倉庫間的相依性為單向
對於每對倉庫,選擇一個 邏輯相依方向:
範例:
-
Sales依賴Marketing的參與度數據。 -
Marketing不依賴於Sales部署 時所需的任何物件。
在實踐中:
Zava.Sales.Warehouse 對 有 Zava.Marketing.Warehouse。
- 倉庫中的
SalesT-SQL 可以使用三部分名稱,例如:SELECT * FROM ZavaMarketingWarehouse.Marketing.CampaignEngagement -
Zava.Marketing.Warehouse不會參考Sales會在部署時強制依賴週期的物件。
小提示
對每對倉庫,繪製一個簡單的箭頭圖(Sales → Marketing)。 如果你發現 同一類型的物件有箭頭同時指向兩個方向,請重構設計以恢復單向依賴性。
避免循環相依
當倉庫 A 和倉庫 B 彼此依賴,導致引擎無法在單一部署中解決時,就會出現循環 依賴 。
問題範例(請勿這麼做):
-
ZavaSalesWarehouse.dbo.CustomerRollup視圖CREATE VIEW dbo.CustomerRollup AS SELECT c.CustomerId, c.TotalRevenue, m.LastCampaignId FROM dbo.CustomerRevenue AS c LEFT OUTER JOIN ZavaMarketingWarehouse.dbo.CustomerEngagement AS m ON c.CustomerId = m.CustomerId; -
ZavaMarketingWarehouse.dbo.CampaignAttribution視圖CREATE VIEW dbo.CampaignAttribution AS SELECT m.CampaignId, SUM(s.TotalRevenue) AS RevenueAttributed FROM dbo.Campaigns AS m LEFT OUTER JOIN ZavaSalesWarehouse.dbo.CustomerRollup AS s ON m.CampaignId = s.LastCampaignId GROUP BY m.CampaignId;
在這個反模式中:
-
CustomerRollup在銷售方面,則取決於CustomerEngagement行銷。 -
CampaignAttribution行銷部門依賴CustomerRollup銷售部門。
這種反模式形成了一個循環:銷售視角→行銷觀點→銷售視角再次出現。
指導方針:
不要把 倉庫間的相互依賴 建模成一般的結構層級物件。 如果你真的需要這種邏輯,將依賴的一方移到:
- 部署後的腳本,或
- 一個在查詢時將兩個倉庫連接起來的下游 語意模型或報告。
使用部署前與部署後指令碼來處理對部署作業敏感的跨倉儲邏輯
由於倉庫部署是 完整的結構差異 操作(而非部分每個物件的部署),因此對跨倉庫項目請謹慎處理:
如果倉庫 A 和倉庫 B 都需要彼此依賴的物件:
- 將 核心資料表和核心檢視 保留在每個倉庫專案中。
- 將創建循環依賴的 橋接視圖或實用物件 移動到同一個項目的 部署前置或後置腳本 中。
- 確保這些腳本是 冪等 且可安全重複執行的。
範例模式:
- 部署前腳本:暫時移除跨倉庫視圖,再套用會導致其損壞的結構修改。
- 部署後腳本:兩個倉庫部署完成後,重新建立或更新跨倉庫視圖。
欲了解更多資訊與範例,請參閱部署前與部署後腳本Fabric Data Warehouse。
模式一:直接透過資料庫引用進行跨倉庫參照
在此模式中,你可以直接在資料庫專案中使用資料庫參考來建模單向相依關係。
步驟一:從兩個現有的倉庫專案開始
你應該已經有:
-
Zava.Sales.Warehouse→部署至ZavaSalesWarehouse -
Zava.Marketing.Warehouse→部署至ZavaMarketingWarehouse
透過 Visual Studio Code 中「開發倉庫專案」的步驟,建立或擷取每個專案。
步驟 2:從銷售到行銷新增資料庫參考
- 在Visual Studio Code中,開啟 Database Projects檢視。
- 右鍵點擊專案
Zava.Sales.Warehouse。 - 選擇 新增資料庫參考資料...。
- 選擇下列其中一個選項:
- 目前工作區中的資料庫專案(也可以在 Visual Studio Code 中開啟參考的資料庫專案),或
-
資料層應用程式(.dacpac)(如果你為倉庫建了一個
.dacpacMarketing,請使用這個選項)。
- 設定參考選項:
- 參考類型: 同一台伺服器,不同的資料庫。
-
資料庫名稱或變數: 例如,使用 SQLCMD 變數
[$(MarketingWarehouseName)]。
- 儲存並重建銷售專案。
在檔案中 .sqlproj ,你應該會看到類似這樣的條目:
<ItemGroup>
<ArtifactReference Include="..\Zava.Marketing.Warehouse\bin\Debug\Zava.Marketing.Warehouse.dacpac">
<DatabaseVariableLiteralValue>$(MarketingWarehouseName)</DatabaseVariableLiteralValue>
</ArtifactReference>
</ItemGroup>
<ItemGroup>
<SqlCmdVariable Include="MarketingWarehouseName">
<DefaultValue>ZavaMarketingWarehouse</DefaultValue>
</SqlCmdVariable>
</ItemGroup>
小提示
透過使用 SQLCMD 變數作為 遠端倉庫名稱,你可以在所有環境(如開發、測試和生產環境)重複使用同一個專案。
步驟 3:在銷售中建立跨倉庫視圖
在Sales專案中,新增一個從Marketing倉庫讀取的視圖:
-- schema/Views/dbo.CustomerEngagementFact.sql
CREATE VIEW [dbo].[CustomerEngagementFact] AS
SELECT
s.CustomerId,
s.TotalRevenue,
m.LatestChannel,
m.LastEngagementDate
FROM dbo.CustomerRevenue AS s
JOIN [$(MarketingWarehouseName)].[dbo].[CustomerEngagement] AS m
ON s.CustomerId = m.CustomerId;
重點︰
- 這個三部分名稱
[$(MarketingWarehouseName)].[dbo].[CustomerEngagement]與 Fabric SQL 編輯器中用於跨倉儲查詢的 T-SQL 模式相符。 - DacFx 透過 資料庫參考來解析外部資料庫。
建立專案以確保 沒有SQL71501未解決的參考錯誤 。
步驟四:先發布行銷倉庫,接著是銷售
為避免部署問題:
-
建置與發佈
Zava.Marketing.Warehouse先:- 右鍵點擊專案→ 建構。
- 右鍵點擊專案→ 發佈 →選擇
ZavaMarketingWarehouse。
- 部署成功後
Marketing,請 建置並發佈Zava.Sales.Warehouse:- 右鍵點擊專案→ 建構。
- 右鍵點擊專案→ 發佈 →選擇
ZavaSalesWarehouse。
最終的部署流程如下:
Zava.Marketing.Warehouse (無外部依賴)→ Zava.Sales.Warehouse (依賴於 Marketing)
現在,任何 T-SQL 查詢在 ZavaSalesWarehouse 中都可以使用 dbo.CustomerEngagementFact 視圖,該視圖透過跨倉庫 T-SQL 從 Marketing 倉庫內部讀取。
繼續學習
- 將此模式結合開發與部署中的原始碼控制與 CI/CD 指導,以及 Fabric git 整合文件。
- 將 Zava Analytics 情境擴展至開發 /測試/生產 環境,利用部署流程或外部 CI/CD 協調多個倉庫間的發佈訂單。