共用方式為


異動資料擷取 (CDC) 與 Azure SQL 資料庫

適用於:Azure SQL 資料庫

本文說明異動資料擷取 (CDC) 如何在 Azure SQL 資料庫中實作,以在修改資料表和資料列時記錄資料庫上的活動。 如需 CDC 功能 (包括如何在 SQL Server 和 Azure SQL 受控執行個體中實作它) 的詳細資訊,請參閱 CDC 與 SQL Server

概觀

在 Azure SQL 資料庫中,異動資料擷取排程器取代了擷取和清理來源資料表變更資料的 SQL Server Agent 作業。 排程器會在資料庫範圍內自動執行擷取和清理處理程序,而不需要任何外部相依性來確保可靠性或效能。 使用者保留視需要手動起始擷取和清理處理程序的選項。

此技術使用之資料取用者的理想範例為擷取、轉換和載入 (ETL) 應用程式。 ETL 應用程式以累加方式,將變更資料從 SQL Server 來源資料表載入資料倉儲或資料超市。 雖然在資料倉儲內的來源資料表表示法必須反映來源資料表中的變更,但是重新整理來源複本的端對端技術並不適用。 您需要的是結構化變更資料的可靠資料流,讓取用者可以將其套用到不同的資料目標表示法。 SQL Server 異動資料擷取提供這項技術。

若要深入了解 Azure SQL 資料庫中的異動資料擷取,請參考此「Data Exposed」單集:

資料流程

下圖顯示 Azure SQL 資料庫中異動資料擷取的主要資料流程:

描述異動資料擷取的資料流程的流程圖表。

必要條件

權限

需要 db_owner 角色才能啟用 Azure SQL 資料庫的異動資料擷取。

Azure SQL 資料庫計算需求

您可以針對單一資料庫彈性集區,為以虛擬核心為基礎的購買模型內的任何服務層級,在 Azure SQL 資料庫上啟用 CDC。

對於 DTU 購買模型中的資料庫,S3 或更高層級的資料庫支援 CDC。 CDC 不支援子核心層 (基本、S0、S1、S2)。

為 Azure SQL 資料庫啟用 CDC

若要為個別資料表建立擷取執行個體,必須先為 Azure SQL 資料庫啟用 CDC。

要啟用 CDC,請透過 Azure Data Studio 或 SQL Server Management Studio (SSMS) 連線到 Azure SQL 資料庫。 開啟新的查詢視窗,然後執行下列 T-SQL 以啟用 CDC:

EXEC sys.sp_cdc_enable_db;
GO

注意

若要確定資料庫是否已啟用,請在 is_cdc_enabled 目錄檢視中查詢 sys.databases 資料行。

為某個資料庫啟用異動資料擷取時,系統也會為該資料庫建立 cdc schemacdc user、中繼資料表及其他系統物件。 cdc schema 包含異動資料擷取中繼資料表,為來源資料表啟用 CDC 後,個別變更資料表將充當變更資料的存放庫。 cdc schema 也包含用來查詢變更資料的相關聯系統函數。

重要

異動資料擷取需要獨佔使用 cdc schemacdc user。 如果資料庫中目前存在名為 cdc 的結構描述或資料庫使用者,則在刪除或重新命名該結構描述和/或使用者之前,無法為該資料庫啟用 CDC。

為資料表啟用 CDC

為 Azure SQL 資料庫啟用 CDC 之後,可以選取一個或多個資料表來追蹤資料變更,以在資料表層級啟用 CDC。 使用預存程式 sys.sp_cdc_enable_table 建立個別源資料表的擷取執行個體。

若要為資料表啟用 CDC,請執行下列 T-SQL:

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = NULL;
GO

提示

上述範例不會藉由將數設定為 NULL 來使用明確的 @role_name,但您可以使用控制角色來限制他人對變更資料的存取權。

來源資料表中要擷取的資料行

根據預設,系統會將來源資料表中的所有資料行識別為擷取資料行。 如果只需要追蹤部分資料行 (例如,基於隱私或效能原因),請使用「@captured_column_list」參數指定這部分的資料行。

若要為資料表中的特定資料行清單啟用 CDC,請執行下列 T-SQL:

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = NULL,
    @captured_column_list = N'Column1, Column2, Column3';
GO

提示

請注意,上一個範例不使用明確的 @role_name 並將參數設定為 NULL,但您可以使用控制角色來限制他人對變更資料的存取權。

用於控制變更資料表存取權的角色

指定角色的目的是要控制變更資料的存取權。 指定的角色可以是現有的固定伺服器角色或資料庫角色。 如果指定的角色不存在,則會自動建立該名稱的資料庫角色。 使用者對於來源資料表的所有擷取資料行必須具備 SELECT 權限。 此外,指定角色時,不屬於系統管理員db_owner 角色之成員的使用者也必須是指定角色的成員。

若要為指定控制角色的資料表啟用 CDC,請執行下列 T-SQL:

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = N'RoleName'
GO

如果不想要使用控制角色,請將 @role_name 參數明確設定為 NULL

用以查詢變更淨值的函數

擷取執行個體一定會包含資料表值函數,以便傳回在定義間隔內發生的所有變更資料表項目。 這個函數的命名方式是將擷取執行個體名稱附加至 cdc.fn_cdc_get_all_changes_。 如需詳細資訊,請參閱 cdc.fn_cdc_get_all_changes

如果 @supports_net_changes 參數設為 1,擷取執行個體也會產生淨變更函數。 此函數僅會針對在呼叫中指定之間隔內變更的每個不同資料列,傳回一個變更。 如需詳細資訊,請參閱 cdc.fn_cdc_get_net_changes

若要支援淨變更查詢,來源資料表必須具有主索引鍵或唯一的索引才能唯一識別資料列。 如果使用了唯一的索引,就必須使用 @index_name 參數來指定該索引的名稱。 在主索引鍵或唯一索引中定義的資料行必須包含在要擷取之來源資料行的清單中。

若要為支援變更凈值的資料表啟用 CDC,請執行下列 T-SQL:

EXEC sys.sp_cdc_enable_table
    @source_schema = N'SchemaName',
    @source_name = N'TableName',
    @role_name = NULL,
    @supports_net_changes = 1
GO

如果在含有現有主索引鍵的資料表上啟用 [異動資料擷取],而且並未使用 @index_name 參數來識別替代的唯一索引鍵,異動資料擷取功能就會使用此主索引鍵。 如果沒有先針對資料表停用異動資料擷取,系統就不允許對主索引鍵進行後續變更。 不論設定異動資料擷取時是否要求淨變更查詢的支援,都是如此。

如果啟用異動資料擷取時,資料表沒有任何主索引鍵,則異動資料擷取就會忽略後續加入主索引鍵的作業。 由於異動資料擷取不會使用啟用資料表之後所建立的主索引鍵,因此您可以移除此索引鍵和索引鍵資料行,而且沒有任何限制。

如需 sys.sp_cdc_enable_table 預存程序引數的詳細資訊,請參閱 sys.sp_cdc_enable_table (Transact-SQL)

提示

若要確定是否已替異動資料擷取啟用來源資料表,請檢查 is_tracked_by_cdc 目錄檢視中的 sys.tables 資料行。

為 Azure SQL 資料庫停用 CDC

為 Azure SQL 資料庫停用 CDC 會移除所有相關的異動資料擷取中繼資料,包括 cdc usercdc schema 和外部排程者擷取和清理處理程序。 不過,系統不會自動移除異動資料擷取所建立的任何控制角色,而且必須明確刪除這些角色。

注意

若要確定資料庫是否已啟用 CDC,請查詢 is_cdc_enabled 目錄檢視中的 sys.databases 資料行。

在資料庫層級停用 CDC 之前,不需要停用個別資料表的 CDC。

若要在資料庫層級停用 CDC,請執行下列 T-SQL:

EXEC sys.sp_cdc_disable_db;
GO

提示

在資料庫層級停用 CDC 之後,如果您想要再次使用 CDC 功能,則必須再次為個別資料表啟用 CDC

管理 CDC

在 Azure SQL 資料庫中,CDC 是追蹤和管理資料庫資料表變更的重要功能。 不同於傳統的 SQL Server 環境,Azure SQL 資料庫會採用異動資料擷取排程者來處理 CDC 工作,而不是依賴 SQL Server Agent 作業。 此排程者會自動起始資料庫內 CDC 資料表的定期擷取和清理處理程序,確保可靠性和效能,剔除外部相依性。

自動 CDC 擷取和清理

Azure SQL 資料庫中的 CDC 擷取作業會順暢地運作,每 20 秒執行一次,以有效率地追蹤變更。 同時,清理作業會每小時執行一次,以確保 CDC 資料表保持最佳化。 使用者可以放心,CDC 管理會自動進行,不需要手動介入。

重要

如果無伺服器資料庫已啟用 CDC 且處於暫停狀態,則 CDC 不會執行。 CDC 掃描不會影響自動暫停功能。

手動 CDC 控制

當 CDC 自動執行時,使用者可彈性地視需要執行手動 CDC 作業。 sp_cdc_scansp_cdc_cleanup_change_tables 程序可讓您視需要觸發擷取和清理工作。

監視 CDC

Azure SQL 資料庫提供重要的工具來監視 CDC 活動。 兩個動態管理檢視 (sys.dm_cdc_log_scan_sessionssys.dm_cdc_errors) 提供 CDC 處理程序的深入解析,確保您能夠充分了解資料變更。

Ill 自訂

雖然 Azure SQL 資料庫簡化了 CDC 管理,但存在一些限制:

  • 無法自訂 CDC 擷取和清理作業的頻率。
  • 擷取和清理作業的 pollingintervalcontinuous 值不適用於 Azure SQL 資料庫。
  • cdc.cdc_jobs 資料表移除擷取作業項目不會停止背景擷取作業。
  • 刪除清理作業項目會停止清理作業。
  • cdc.cdc_jobs 資料表位於 cdc 結構描述中,而不是 msdb

儘管有這些限制,仍然可以自訂下列選項:

  • 查詢 cdc.cdc_jobs 資料表以取得目前的設定詳細資料。
  • 使用 sp_cdc_change_job 預存程序調整 maxtransmaxscans 選項。
  • 視需要僱用 sp_cdc_drop_jobsp_cdc_add_job 來管理作業。

效能考量和建議

為 Azure SQL 資料庫啟用異動資料擷取,其效能效果與為 SQL Server 或 Azure SQL 受控執行個體啟用 CDC 相當。 不過,啟用 CDC 時,有數個因素會影響效能效果,包括:

  • Azure SQL 資料庫中已啟用 CDC 的資料表數目。

  • 追蹤資料表或交易量中的變更頻率。 作用中交易會阻止記錄截斷,直至交易提交且 CDC 掃描趕上或者交易中止。 這可能導致交易記錄比平常填得更滿且應受到監視,如此一來交易記錄就不會填滿。

  • 確定來源資料庫中有可用空間,因為 CDC 成品 (例如 CT 資料表、cdc_jobs 等等) 儲存在相同的資料庫中。

  • 不論使用的是單一資料庫,還是屬於彈性集區的一部分。

  • 彈性集區中的資料庫會共用資源 (例如磁碟空間),因此在多個資料庫上啟用 CDC 很有可能會觸及彈性集區磁碟大小的上限。 監視 CPU、記憶體和記錄輸送量等資源。 如需詳細資訊,請參閱密集彈性集區中的資源管理

  • 在處理彈性集區中的資料庫時,請務必考慮已啟用 CDC 的資料表計數,以及這些資料表所屬的資料庫數目。 建議您評估自己的工作負載,並採取必要措施,例如調整彈性集區。 如需詳細資訊,請參閱在 Azure SQL 資料庫中調整彈性集區資源

重要

這些考量是一般指導。 如需針對特定工作負載最佳化效能的精確指導,請聯絡 Microsoft 支援服務

當您搭配 Azure SQL 資料庫使用 CDC 時,請考慮下列最佳做法:

  • 在實際執行環境中啟用 CDC,以協助您確定適合您工作負載的適當 SLO 之前,徹底測試您的工作負載。 如需 Azure SQL 資料庫計算大小的詳細資訊,請參閱服務層級

  • 請考慮調整虛擬核心數目,或轉換至較高的資料庫層級,例如超大規模資料庫,以在 Azure SQL 資料庫上啟用 CDC 之後維持先前的效能等級。 如需詳細資訊,請參閱虛擬核心購買模型 - Azure SQL 資料庫超大規模資料庫服務層級

  • 密切監視空間使用率。 如需詳細資訊,請參閱管理 Azure SQL 資料庫資料庫的檔案空間

  • 如需詳細資訊,請參閱使用者工作負載和內部處理程序的資源使用量

  • CDC 掃描和清理處理程序是一般資料庫工作負載的一部分 (也會取用資源)。 根據交易量的不同,由於掃描和清理處理程序跟不上工作負載,效能可能會嚴重下降,因為所有行都被新增到變更資料表中,並且對於更新操作,還包括原像。 建議您評估工作負載,並根據先前的建議採取必要措施。 如需詳細資訊,請參閱本文的 CDC 管理部分。

重要

排程者會在 SQL Database 內自動執行擷取和清理。 CDC 擷取作業每隔 20 秒執行一次,而清理作業每小時執行一次

  • 若要防止延遲增加,請確定已啟用 CDC 的資料庫數量不會超過配置給彈性集區的虛擬核心數量。 若要進一步了解,請參閱密集彈性集區中的資源管理

  • 根據您的工作負載和效能等級,請考慮將 CDC 保留期間變更為小於預設值三天,以確保清理處理程序可以跟上變更資料表中的變更。 在監視資料庫大小時維持較低的保留期間是很好的作法。

  • 當變更將填入變更資料表時,不提供服務等級協定 (SLA)。 也不支援次要延遲。

已知問題與限制

積極性記錄截斷

在 Azure SQL Server 上啟用異動資料擷取 (CDC) 時,加速資料庫復原 (ADR) 的主動記錄截斷功能會停用。 這是因為 CDC 掃描會存取資料庫交易記錄。 使用中交易將阻止交易記錄截斷,直到交易提交且 CDC 掃描跟上或交易中止為止。 這可能導致交易記錄比平常填得更滿且應受到監視,如此一來交易記錄就不會填滿。

啟用 CDC 時,我們建議您在建立或重建索引時使用可復原索引選項。 可復原索引不會使長時間運行的交易保持開啟狀態,並允許在操作期間截斷記錄以實現更好的記錄空間管理。 如需詳細資訊,請參閱線上索引作業的指導方針 - 可繼續索引考量因素

Azure SQL 資料庫服務層級

雖然以虛擬核心為基礎的購買模型內任何服務層級資料庫彈性集區都支援 CDC,但 DTU 購買模型中不支援低於 S3 (例如基本、S0、S1、S2) 的資料庫。

Azure SQL 資料庫記錄限制

加速資料庫復原和 CDC 在 Azure SQL 資料庫中不相容。 這是因為 CDC 掃描會主動存取資料庫交易記錄並與之交互,這可能與 ADR 的主動記錄截斷行為發生衝突。

若要防止延展性和空間管理問題,請密切監視 Azure SQL 資料庫,並考慮調整為較高的資料庫層級,並根據工作負載需求讓交易記錄成長。

提示

如果您的工作負載需要較高的整體效能,因為交易記錄輸送量較高,且交易提交時間更快,請使用超大規模資料庫服務層級

擷取和清理自訂

無法在 Azure SQL 資料庫中設定 CDC 的擷取頻率和清除程序。 排程者會自動執行擷取和清理。

Azure SQL 資料庫中的容錯移轉

在本機或 GeoDR 容錯移轉案例的情況下,如果您的資料庫已啟用 CDC,在容錯移轉發生之後,新的主資料庫上會自動執行擷取和清理資料變更的處理程序。

Microsoft Entra ID

注意

Microsoft Entra ID 先前稱為 Azure Active Directory (Azure AD)。

如果以 Microsoft Entra 使用者身分在 Azure SQL 資料庫中建立資料庫並在其上啟用 CDC,則 SQL 使用者 (例如,即使是 sysadmin 角色的使用者) 也無法停用/變更 CDC 成品。 但是,另一個 Microsoft Entra 使用者能夠在相同的資料庫上啟用/停用 CDC。

同樣地,如果您以 SQL 使用者的身分建立 Azure SQL 資料庫,則無法以 Microsoft Entra 使用者身分啟用/停用異動資料擷取。

如果您以 Microsoft Entra 使用者身分在 Azure SQL 資料庫中建立資料庫,則啟用 CDC 會失敗;請不要啟用 CDC,然後在還原資料庫之後嘗試啟用 CDC。

若要解決此問題,請使用您的 Microsoft Entra 管理帳戶連線到您的資料庫,然後執行下列 T-SQL:

ALTER AUTHORIZATION ON DATABASE::[<restored_db_name>] TO [<azuread_admin_login_name>];

EXEC sys.sp_cdc_enable_db;

還原時間點 (PITR)

如果您以 SQL 使用者身分在 Azure SQL 資料庫上啟用 CDC,則除非還原至子核心 SLO,否則時間點還原 (PITR) 也會將 CDC 保留在已還原的資料庫中。 如果還原至子核心 SLO,將無法使用 CDC 成品。

如果您以 Microsoft Azure 使用者身分在資料庫上啟用 CDC,則無法執行時間點復原 (PITR) 到子核心 SLO。 建議您將資料庫還原至與來源相同或更高版本的 SLO,然後視需要停用 CDC。

疑難排解

本節提供與 Azure SQL 資料庫CDC 相關聯的指導和疑難排解步驟。 CDC 相關的錯誤可能會阻礙擷取處理程序的正常運作,並導致資料庫交易記錄擴充。

若要檢查這些錯誤,您可以查詢動態管理檢視 sys.dm_cdc_errors。 如果 sys.dm_cdc_errors 動態管理檢視傳回任何錯誤,請參閱下一節以了解緩解步驟。

注意

如需有關特定錯誤碼的詳細資訊,請參閱資料庫引擎事件和錯誤

以下是本節中包含的不同疑難排解類別:

類別 描述
已修改的中繼資料 包含有關如何在已修改或刪除追蹤資料表時緩解 CDC 相關問題的資訊。
資料庫空間管理 包括有關在資料庫空間用盡時如何緩解問題的資訊。
CDC 限制 包含有關如何緩解 CDC 限制所造成問題的資訊。

已修改的中繼資料

錯誤 200/208 – 無效的物件名稱

  • 原因:刪除 CDC 中繼資料時,可能會發生錯誤。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:若要解決此問題,您需要為資料庫停用並重新啟用 CDC。 在為資料庫啟用異動資料擷取時,也會為資料庫建立 cdc 結構描述、cdc 使用者、中繼資料表及其他系統物件。 為資料庫啟用 CDC 之後,必須手動重新啟用個別資料表的 CDC

注意

不改變或刪除在 sys.objects 系統目錄檢視中找到的具有 is_ms_shipped=1schema_name=cdc 的物件。

錯誤 1202 - 資料庫主體不存在,或者使用者不是成員

  • 原因:刪除 CDC 使用者時,可能會發生錯誤。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:請確保 cdc 使用者存在於您的資料庫中,並已指派 db_owner 角色。 若要建立 cdc 使用者,請參閱建立 cdc 使用者和指派角色範例。

錯誤 15517 - 無法以資料庫主體的形式執行,因為主體不存在

  • 原因:無法模擬這種類型的主體,或您沒有權限。 CDC 中繼資料已刪除或不再是 db_owner 角色的一部分時,可能會發生錯誤。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:請確保 cdc 使用者存在於您的資料庫中,並已指派 db_owner 角色。 若要建立 cdc 使用者,請參閱建立 cdc 使用者和指派角色範例。

錯誤 18807 – 找不到複寫系統資料表的物件識別碼

  • 原因:在 SQL Server 找不到或存取複寫系統資料表 '%s' 時,會發生此錯誤。 這可能是因為資料表遺失或無法連線。 若要讓 CDC 正常運作,您不應手動修改任何 CDC 中繼資料,例如 CDC schema、變更資料表、CDC 系統預存程序、預設 cdc user 權限 (sys.database_principals) 或重新命名 cdc user

  • 建議:請確認該系統資料表已存在,而且可直接透過查詢資料表存取。 查詢 sys.objects 系統目錄,透過 is_ms_shipped=1schema_name=cdc 設定述詞子句,以列出所有與 CDC 相關的物件。 如果查詢未傳回任何物件,則您應停用並重新啟用資料庫的 CDC。 為資料庫啟用異動資料擷取會針對資料庫建立 cdc schemacdc user、中繼資料表及其他系統物件。 為資料庫啟用 CDC 之後,必須手動重新啟用個別資料表的 CDC

錯誤 21050 – 只有系統管理員或 db_owner 固定伺服器角色的成員才能執行此作業

  • 原因cdc 使用者已從 db_owner 資料庫角色或 sysadmin 伺服器角色中移除。

  • 建議:確保 cdc 使用者已指派 db_owner 角色。 若要建立 cdc 使用者,請參閱建立 cdc 使用者並指派角色範例。

資料庫空間管理

錯誤 1105 – 檔案群組已滿,無法在資料庫中為物件配置空間

  • 原因:在資料庫的主要檔案群組空間不足,且 SQL Database 無法為該檔案群組內的物件 (例如資料表或索引) 配置更多空間時,會發生此錯誤。

  • 建議:若要解決此問題,請刪除資料庫內任何不必要的資料以釋放空間。 識別可以安全地移除的檔案群組中未使用的資料表、索引或其他物件。 密切監視空間使用率,如需詳細資訊,請參閱管理 Azure SQL 資料庫資料庫的檔案空間

    如果刪除不必要的資料/物件不是選項,請考慮調整為較高的資料庫層級。

重要

如需 Azure SQL 資料庫(單一資料庫) 計算大小 (SLO) 的詳細資訊,請參閱使用虛擬核心購買模型的單一資料庫資源限制使用 DTU 購買模型的單一資料庫資源限制 - Azure SQL 資料庫

錯誤 1132 - 彈性集區已達到其儲存空間限制

  • 原因:當彈性集區中的儲存體使用量超過配置的限制時,就會發生此錯誤。

  • 建議:若要解決此問題,請實作資料封存和清除策略,只保留屬於彈性集區一部分之資料庫中的必要資料。 密切監視空間使用率。 如需詳細資訊,請參閱管理 Azure SQL 資料庫資料庫的檔案空間

    如果封存資料或刪除不必要的資料/物件不是選項,請考慮調整為較高的資料庫層級。

重要

如需 Azure SQL 資料庫(單一資料庫) 計算大小 (SLO) 的詳細資訊,請參閱使用虛擬核心購買模型的彈性集區資源限制使用 DTU 購買模型的彈性集區資源限制

CDC 限制

錯誤 2628 – 字串或二進位資料在資料表中會被截斷

  • 原因:使用 DDL 陳述式變更啟用 CDC 的資料表的資料行大小可能會導致後續 CDC 擷取處理程序發生問題。 sys.dm_cdc_errors 動態管理檢視 (DMV) 對於檢查任何 CDC 是否有任何報告的問題 (例如錯誤號碼 2628 和 8115) 非常有用。

  • 建議:在對資料行大小進行任何變更之前,您必須評定變更是否與 CDC 變更資料表中的現有資料相容。 若要解決此問題,您需要為資料庫停用並重新啟用 CDC。 如需有關為資料庫或資料表啟用 CDC 的詳細資訊,請參閱本文的為 Azure SQL 資料庫啟用 CDC為資料表啟用 CDC 章節。

錯誤 22830 - 此版本的 SQL Server 不支援模擬內容中的內建函數 'SUSER_SNAME'

  • 原因:如果資料庫上存在對 SUSER_SNAME() 上的 create_table 的呼叫的使用者觸發程式,則在啟用 CDC 期間會出現此錯誤。 您可以使用下列 Transact-SQL 指令碼列出觸發程式。 這個指令提供物件觸發程式和對應 object_id 的詳細資料:

    SELECT name,
        object_id
    FROM sys.triggers
    WHERE parent_class_desc = 'DATABASE'
        AND is_disabled = 0;
    

    取得觸發程式定義之後,您可以使用下列指令碼來尋找對 SYSTEM_USER 的呼叫:

    SELECT OBJECT_DEFINITION(object_id) AS trigger_definition;
    
  • 建議:若要解決此問題,請針對從先前指令碼取得的每個使用者觸發程式,遵循下列步驟。

    • 停用觸發程式
    • 啟用 CDC
    • 重新啟用觸發程式

如需詳細資訊,請參閱 DISABLE TRIGGER (Transact-SQL)

錯誤 913 - 處理具有系統 CLR 資料類型的資料表的變更時,CDC 擷取作業失敗

  • 原因:當 CDC 擷取作業正在處理與其他資料表相關的變更時,在具有系統 CLR 資料類型的資料表上啟用 CDC、進行 DML 變更,然後在相同資料表上進行 DDL 變更時,會發生此錯誤。

  • 建議:建議的步驟是停止對資料表的 DML,執行擷取作業來處理變更,為資料表執行 DDL,執行擷取作業來處理 DDL 變更,然後重新啟用 DML 處理。 如需詳細資訊,請參閱處理變更時 CDC 擷取作業失敗

建立使用者和指派角色

如果已移除 cdc user,您可以手動新增回此使用者。

使用下列 T-SQL 指令碼來建立使用者 (cdc),並指派適當的角色 (db_owner)。

IF NOT EXISTS (
    SELECT *
    FROM sys.database_principals
    WHERE NAME = 'cdc'
)
BEGIN
    CREATE USER [cdc] WITHOUT LOGIN
    WITH DEFAULT_SCHEMA = [cdc];
END

EXEC sp_addrolemember 'db_owner', 'cdc';

檢查並新增角色成員資格

若要確認 cdc 使用者是否屬於 sysadmindb_owner 角色,請執行下列 T-SQL 查詢:

EXECUTE AS USER = 'cdc';

SELECT is_srvrolemember('sysadmin'), is_member('db_owner');

如果 cdc 使用者不屬於任一角色,請執行下列 T-SQL 查詢,以將 db_owner 角色新增至 cdc 使用者。

EXEC sp_addrolemember 'db_owner' , 'cdc';