適用於 Dataverse 的 Azure Synapse Link 常見問題集

本文提供有關將 Microsoft Dataverse 資料表資料匯出至 Azure Synapse Analytics 和 Azure Data Lake 的常見問題的資訊。

我可以手動執行工作,例如建立、更新、刪除或設定已連線 Azure 儲存體中資料檔案的自動刪除原則嗎?

客戶不應修改資料檔案,也不應將任何客戶檔案放置在資料資料夾中。

備註

若要移除資料湖中的過時和停滯資料,而不中斷 Azure Synapse Link,請考慮使用查詢並分析累加更新功能

如何存取我的資料表關聯?

若要存取多對多關係,該關係可作為表格,從 新增資料表 頁面選擇新連結,從 管理資料表 中選擇既有連結。

備註

以 CSV 格式撰寫時,所有關係資料預設都處於僅限附加模式。

Azure Synapse Link 是 Dataverse 的免費功能。 使用 Azure Synapse Link for Dataverse 不會產生 Dataverse 下的額外費用。 不過,請考慮 Azure 服務的潛在成本:

新增欄時會發生什麼事?

將新資料行新增至來源中的表格時,該資料行也將新增到目的地檔案中相應檔案分割區的檔案結尾。 雖然新增資料行之前存在的資料列不會顯示在新資料行中,但新的或更新的資料列會顯示新新增的資料行。

為什麼新增的欄位沒有出現在資料湖中?

當你在來源資料表新增欄位時,該新元資料(欄位)只會在該資料表下一次資料變更時同步到資料湖。 Azure Synapse Link 會將元資料變更與資料變更同步——不會針對僅有元資料的變更觸發獨立同步。 因此:

  • 若在新增資料欄後建立或更新一列或多列資料,下一次差異同步就會擷取到新的資料欄,並從該時間點起在資料湖中提供使用。
  • 若欄位加入後資料未變更,新欄位僅保留在來源,不會自動同步。

若在預期資料不會變動時立即引入新欄位,請重新同步受影響的資料表。 這種行為適用於所有個人檔案類型。

備註

這是預期的行為。 僅針對元資料的變更,例如新增欄位但沒有隨之而來的資料變更,單獨不會觸發同步。該欄位會在下一次資料變更時匯出,或在手動重新同步表格後完成。

刪除欄時會發生什麼事?

當您從來源中的表格刪除資料行時,該資料行不會從目的地中刪除。 相反地,資料列不再更新,並標示為空值,同時保留先前的資料列。

如果我變更資料行的資料類型,會發生什麼事?

變更資料行的資料類型是中斷性變更,您需要取消連結並重新連結。

刪除資料列時會發生什麼事?

根據您選擇的資料寫入選項,刪除資料列的處理方式會有所不同:

  • 使用 CSV 格式就地更新:這是預設模式。 當您在此模式中刪除資料表資料列時,也會從 Azure Data Lake 中的對應資料分割區中刪除資料列。 換句話說,資料會從目的地硬刪除。
  • 僅附加 (CSV 格式與累加資料夾更新):在此模式下,當 Dataverse 資料表資料列遭到刪除時,並不會立即從目的地硬刪除。 取而代之的是新增一列,並設定為 isDeleted=True Azure Data Lake 中對應的資料分割區。 Azure Synapse Link 會在 30 天後硬刪除已刪除的紀錄。
  • 匯出至 Delta Lake 格式:Azure Synapse Link 會在下一個 Delta 同步處理週期期間對資料執行軟刪除,然後在 30 天後進行硬刪除。

若要保存已刪除紀錄超過 30 天, 請啟用表格的長期保留功能。

為什麼我在匯出的檔案中看不到欄標題?

Azure Synapse Link 遵循通用數據模型,讓數據及其意義可以在應用程式和商務程式之間共用,例如 Microsoft Power Apps、Power BI、Dynamics 365 和 Azure。 在每個 CDM 資料夾中,資料行標頭等中繼資料會儲存在 model.json 檔案中。 其他資訊: Common Data Model 和 Azure Data Lake Storage Gen2 | Microsoft Learn

為什麼 Model.json 檔案會增加或變更資料類型的長度,並且不保留 Dataverse 中定義的內容?

Model. json 不因資料行大小改變而變更資料庫長度。 Dataverse 對每個資料行都有資料庫長度的概念。 如果您建立大小為 200 的資料行,然後將其減少到 100,Dataverse 仍允許您的現有資料出現在 Dataverse 中。 它通過保持 DBLength 200 和 MaxLength 100 來做到這一點。 您在 Model.json 中看到的是 DBLength,如果您將其用於下游流程,就不會為 Dataverse 資料行配置更少的空間。

備註

備忘錄欄位定義為 varchar(max) 預設長度上限為 9999。

匯出的 Dataverse 資料表中可以預期哪些日期和時間格式?

匯出的 Dataverse 資料表中可以預期三種日期和時間格式。

欄位名稱 格式 資料類型 範例
SinkCreatedOn 和 SinkModifiedOn M/d/yyyy H:mm:ss tt 日期時間 2021/6/28 下午4:34:35
CreatedOn yyyy-MM-dd'T'HH:mm:ss.sssssssXXX datetimeOffset 2018-05-25T16:21:09.0000000+00:00
所有其他欄位 yyyy-MM-dd'T'HH:mm:ss'Z' 日期時間 2021-06-25T16:21:12Z

備註

CreatedOn 資料型別從 datetime 2022 年 7 月 29 日變更為 。datetimeOffset 若要在變更前,編輯先前建立之表格的資料類型格式,請刪除並重新新增該表。

您可以為 Dataverse 中的日期和時間欄選擇不同的欄行為,這會更新資料類型格式。 其他資訊: 日期和時間欄位的特性和格式

為什麼我看到某些 Dataverse 資料表的檔案名稱為 1.csv 或 1_001.csv,而不是一般日期時間分割檔案名稱?

當您選擇僅附加匯出模式,且資料表沒有有效的 CreatedOn 資料行時,這種行為是可以預料的。 Blob 會組織成 1.csv、 2.csv 等檔案 (由於沒有有效的建立日期,因此會採用自訂分割)。 當任何分割區接近 MaxBlockPerBlobLimit 的 95% 時,系統會自動產生新的檔案,此處如 1_001.csv所示。

何時應該使用每年或每月的分割策略?

對於一年內資料量較高的 Dataverse 資料表,建議您使用每月分割區。 這樣做會導致更小的檔案和更好的效能。 此外,如果 Dataverse 資料表中的資料列經常更新,則分割成多個較小的檔案有助於在就地更新案例中提高效能。 Delta Lake 僅適用於年度分割區,因為與 CSV 格式相比,其效能優越。

什麼是「僅附加」模式,而「僅附加」與「就地更新」模式之間有何區別?

在僅追加模式下,來自 Dataverse 資料表的增量資料會追加至資料湖中相對應的檔案分區。 如需詳細資訊: Azure Synapse Link 中的進階設定選項

何時使用僅附加模式來檢視變更歷程記錄?

僅追加模式是將 Dataverse 資料表資料寫入資料湖的建議選項,特別是在資料量龐大且資料頻繁變動的分區中。 同樣地,這是企業客戶常用且強烈建議的選項。 此外,您可以選擇將此模式用於意圖以累加方式檢閱 Dataverse 變更並處理 ETL、AI 和 ML 案例變更的案例。 僅附加模式提供變更歷程記錄,而不是最新變更或就地更新,並啟用 AI 案例的多個時間序列,例如根據歷史值所做的預測或預測分析。

如何在以追加模式匯出資料時,擷取每筆記錄的最新資料列,並排除已刪除的資料列?

在僅附加模式下,您應該先使用 VersionNumber 識別具有相同 ID 的最新版本記錄,然後使用 SinkModifiedOn ,最後將 isDeleted=0 套用到最新版本。

為什麼我使用僅附加模式匯出資料時會看到重複的版本號碼?

對於僅追加模式,如果 Azure Synapse Link for Dataverse 因網路延遲等原因未從 Azure 資料湖收到資料提交確認,Azure Synapse Link 會在這種情況下重新嘗試,並再次提交資料。 下游消耗應該透過使用SinkModifiedOn來篩選數據,從而增強對此情境的韌性。

為什麼包含與保留系統欄位名稱相同的資料表,同步會失敗?

Azure Synapse Link 會為它寫入資料湖的每個資料表加入一組保留系統欄位。 versionnumber 是其中一欄,用於追蹤列版本。 更多資訊: 處理資料與元資料

只有當來源資料表中尚未出現該名稱的欄位時,才會新增保留欄位。 如果來源資料表已經包含同名欄位,則保留現有欄位及其值。 由於這些值不符合保留欄位預期的格式,同步可能會失敗,最常見於初始同步時。

這是預期中的行為,不會自動解決。 單一欄位無法同時保存來源值和系統值,因此無論保留哪一欄,另一欄都會永久遺失,導致湖中資料不一致。

要解決此問題,請按照以下作業執行:

  • 如果不需要同步該資料表,請從 Azure Synapse Link 設定檔中排除受影響的資料表。
  • 將來源中衝突的欄位重新命名,使其不再與保留欄位名稱相符。

備註

這種衝突最常見於財務與營運應用程式的表格,這些表格定義了自己的版本追蹤欄位。 WHSWorkUserSession表格是常見的例子。

為什麼我會在「SinkModifiedOn」和「ModifiedOn」欄位看到差異?

這是預期行為。 ModifiedOn 是記錄在 Dataverse 中最後一次更改的日期與時間,而 SinkModifiedOn 是該紀錄寫入資料湖的日期與時間。 SinkModifiedOn 通常比 ModifiedOn晚,且差異取決於批次大小、系統負載及處理記錄數量等因素。

對於以 Delta Lake 格式匯出,或採用僅追加/增量 CSV 模式的表格,SinkCreatedOn 和 SinkModifiedOn 都反映相同的寫入時間。 因此,在這些模式下,SinkCreatedOn 與 CreatedOn 之間的差異並不是同步延遲的可靠指標,也不應據此解讀。

這很重要

在財務與營運應用程式中,長期交易可能會多次同步,以確保資料不會遺失。 在此情況下,反映 SinkModifiedOn 的是最後一次同步時間,而非第一次。 例如,如果一個紀錄在一小時內同步了 10 次, SinkModifiedOn 即使資料從第一次同步時就已經在湖中,仍顯示第 10 次同步的時間。 根據 SinkModifiedOn 和 ModifiedOn 之間的差異來建立延遲報告時請謹慎,因為這可能會對實際資料的可用性產生誤導性印象。

哪些 Dataverse 資料表不支援匯出?

除了下列系統資料表之外,不支援任何未啟用變更追蹤的資料表:

  • 附件
  • 行事曆
  • 行事曆規則

某些 Dataverse 表格,如 postcomment、postregarding、postlike、post 和 postrole,此類表格無法讓客戶透過 Azure Synapse Link 啟用同步。

在某些情況下,這些資料表可能會在啟用 Dataverse 長期保留 時出現。 如果發生這種情況,這些資料表中的子集或全部紀錄可能會被匯出。 這是長期留任情境下的預期行為。

這很重要

  • 這些表格不應該被選中來同步。
  • 他們的存在並不代表對增量同步的完全支援。

備註

您可以使用 Azure Synapse Link for Dataverse 新增要匯出的稽核資料表。 不過,只有 Delta Lake 設定檔支援稽核資料表的匯出。

為什麼我在資料湖中看不到我所有的備註(標註記錄)?

Azure Synapse Link 不會同步儲存在 annotation(備註)表上的檔案內容。 在筆記記錄中,附帶的檔案會被保存在 documentbody 欄位中,而該檔案內容不會同步到資料湖。 這是設計使然。 因此:

  • 在 annotation 欄中有值的 documentbody 記錄 (含檔案附件的附註) 不會匯出至資料湖。
  • annotation 在 documentbody 中沒有值的紀錄(未附加檔案的筆記)會如預期同步。

我使用匯出至 delta lake 功能,我可以停止 Apache Spark 作業或變更執行時間嗎?

當設定的時間間隔內發生資料變更時,會觸發 Delta Lake 轉換作業。 沒有停止或暫停 Apache Spark 集區的選項。 不過,您可以在「管理資料表進 > 階時間間隔」下修改連結建立後的時間間隔。

查閱資料行是由識別碼和值所組成。 查閱值只會在根資料表上變更。 為了更好地顯示查閱欄位的值,建議您連接原始根表以取得最新值。

在 Dataverse 中,計算出的欄位僅儲存公式定義,實際值則由底層欄位推導。 因此,只有當所有參考欄位都位於同一匯出資料表中時,才支援計算欄位。 Azure Synapse Link 根據 Dataverse 變更追蹤同步資料。 在增量同步期間,只有當記錄的版本改變時,紀錄才會被重新匯出。 如果計算出的欄位值在紀錄沒有相應版本變更的情況下變動,更新後的值不會同步到資料湖,直到紀錄更新且版本改變。 例如,如果計算欄位在初始同步期間評估為 NULL,則會將 NULL 寫入資料湖。 如果計算所用的輸入後來改變,但記錄版本沒有改變,Azure Synapse Link 將無法偵測重新計算的值,資料湖會繼續顯示 NULL。 當紀錄更新且版本變更後,Azure Synapse Link 會以最新計算的欄位值重新匯出該紀錄。

為什麼有些欄位的數值會匯出為空值,儘管同步成功了?

如果某個資料表成功同步,但特定欄位每列都包含空值,請檢查該欄位是否啟用欄位層級的安全機制。 欄位層級安全性限制對單一欄位的存取,適用於貨幣欄位及其他欄位類型。 更多資訊: 欄位層級安全

Azure Synapse Link 以應用程式使用者身份讀取 Dataverse 資料。 當欄位被保護時,應用程式使用者必須透過欄位安全設定檔獲得該欄位的讀取權限。 如果應用程式使用者沒有被加入保護該欄位的設定檔,同步會成功完成,其他欄位也會如預期匯出,但已確保欄位會匯出為空欄位。

為了解決此問題,請將 Azure Synapse Link 應用程式使用者 Dynamics365Athena2 加入保護受影響欄位的安全設定檔,並授予其讀取權限。 其他資訊: 將小組或使用者新增至資料行安全性設定檔以控制存取

備註

在你授權讀取權限後,這些值會隨著受影響列的下一次資料變更一起匯出。 沒有更新的資料列會繼續顯示空值,直到記錄改變或你重新同步資料表。

哪些 Dataverse 資料表預設使用僅附加模式來運作?

預設情況下,所有沒有 createdOn 欄位的資料表都會使用僅附加模式進行同步處理。 這包括關聯性資料表和 ActivityParty 資料表。

為什麼我會看到錯誤訊息 - 無法列出路徑上目錄的內容?

  • Dataverse 資料儲存在連線的儲存容器中。 您需要所連結儲存體帳戶中的「儲存體機器人資料餐與者」角色,才能透過 Synapse 工作區執行讀取和查詢作業。
  • 如果您選擇以 Delta Lake 格式匯出資料,則會在 Delta Lake 轉換之後清除您的 CSV 檔案。 您必須透過 Synapse 工作區查詢具有 non_partitioned 資料表的資料。

為什麼我會看到錯誤訊息 - 無法大量載入,因為檔案不完整或無法讀取 (僅限 CSV 檔案)?

Dataverse 資料可以透過建立、更新和刪除交易來持續變更。 此錯誤是由於在從基底檔案讀取資料時該檔案被變更而引起的。 因此,對於持續變更的表格,請您變更消耗管道,以使用快照集資料 (分區表格) 來消耗。 詳細資訊: 疑難排解無伺服器 SQL 集區

Yes. Azure Synapse Link 會透過 Dataverse 讀取資料列,因此 Dataverse 的每筆記錄限制都適用於同步。最常見的限制是伺服器傳回之單筆記錄未壓縮大小上限為 200 MiB。

此限制通常適用於儲存大型自由格式內容或二進位資料的資料表。 例如:

  • email 包含完整的訊息內文。
  • activitypointer 包含長篇描述。
  • activitymimeattachment 保存內嵌及附加檔案。

這是 Dataverse 平台的限制,無法在申請時提高。 該服務不會截斷或修改客戶資料。 解決方法是刪除 Dataverse 中過大紀錄、清除大欄位,或將內容移出 Dataverse。

適用於 Dataverse 的 Azure Synapse Link 是專為分析目的而設計的。 我們建議客戶使用長期備份來進行封存用途。 更多資訊:Dataverse 長期資料儲存概觀

為什麼在 Dataverse 中刪除記錄時,我沒有在資料湖中看到任何資料變更?

對於任何直接 SQL 呼叫以移除記錄,Azure Synapse Link for Dataverse 服務不會觸發,因為未呼叫 BPO.Delete。 想看範例功能,請前往 「如何清理繼承存取權」。

為什麼我在 Apache Spark 3.5 或更新版本中讀取 Parquet 檔案時,時間戳欄位會出現類型轉換錯誤?

在 Bring Your own lake 和 managed data lake 設定檔中,Parquet 檔案的時間戳記都是以 INT64 格式儲存。 透過 Apache Spark 3.5 或更新版本讀取這些 Parquet 檔案時,下游管線 (例如 Azure Synapse 管線複製作業) 可能會發生錯誤。 此行為是因為 INT96 不再是 Spark 3.5 中時間戳記的預設模式。

你可能會看到類似的錯誤:

TypeConversionNotSupportedDataTypes, Exception occurred when converting value "1774478519775185" for column name 'SinkCreatedOn' from type 'Int64'

為了減輕這個問題,可以在你的目標 SQL 資料庫中加入一個 SQL 函式,將 INT64 的時間戳記值轉換成適當的 datetime 格式。 或者,更新你的下游管線,改用 INT64 格式。