開發和部署跨倉庫依賴關係

在本文中,您將學習如何透過 Visual Studio Code 中的 SQL 資料庫專案來建模與部署跨倉庫相依關係。 你可以從兩個現有的倉庫專案開始,透過資料庫參考以及必要時的 部署前和部署後腳本,設定它們之間的單向相依關係。

本文基於在 Visual Studio Code 中開發資料倉庫專案的概念,並假設你已經熟練掌握了建立和發布單一資料倉庫專案的能力。

先決條件

開始之前,請確定您:

  • 在同一工作區建立 兩個布料倉庫 。
  • 在 Visual Studio Code 中為每個倉庫建立或擷取一個 database 專案。
  • 在你的工作站上安裝 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 中的 warehouse 專案,以及如何將它們作為一般程式碼專案在 Git 中版本化。 適用於工作區和倉儲項目的 Fabric Git 整合,分別於 開發與部署和 Git 整合中說明。 文章假設你的 Fabric 工作區是部署目標,而 T-SQL 架構存在於一個或多個 Visual Studio Code 專案中,這些專案由你在 Git 中進行版本控制。

本文 不涵蓋Lakehouse 的 SQL 分析端點的跨倉庫開發。 Lakehouse 資料表和 SQL 分析端點物件在原始碼控制中不會像倉庫專案那樣被追蹤。 使用 Warehouse 項目搭配資料庫專案,完整整合 git 與部署,支援 Fabric 原生體驗與客戶端工具。

情境:Zava Analytics 跨域倉庫

Zava Analytics 使用兩個商業領域:

  • 銷售 ——客戶訂單、營收及管線指標。
  • 行銷 ——活動、通路與互動指標。

每個領域具備:

  • 同一工作區的 布料倉庫 :

    • ZavaSalesWarehouse
    • ZavaMarketingWarehouse
  • 在 Visual Studio Code 中的 資料庫專案:

    • Zava.Sales.Warehouse
    • Zava.Marketing.Warehouse

為了建立端對端的 ELT 與報告,每個網域都需要 唯讀檢視 以存取另一個網域的資料:

  • Sales 需要顧客參與行銷活動。
  • Marketing 需要根據活動來獲得銷售表現數據。

您需要:

  • 透過資料庫參考建立 單向跨倉庫相依 關係。
  • 避免循環依賴。

確保倉庫間的相依性為單向

對於每對倉庫,選擇一個 邏輯相依方向:

範例:

  • Sales 依賴 Marketing 的參與度數據。
  • Marketing 不依賴於 Sales 部署 時所需的任何物件。

在實踐中:

Zava.Sales.Warehouse 對 有 Zava.Marketing.Warehouse。

  • 倉庫中的 Sales T-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 協調多個倉庫間的發佈訂單。