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

適用於:Azure SQL Database

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

概觀

在 Azure SQL 資料庫 中,異動數據擷取排程器會取代擷取和清除源數據表變更數據的 SQL Server Agent 作業。 排程器會在資料庫範圍內自動執行擷取和清除程式,確保沒有外部相依性的可靠性和效能。 使用者保留選項,視需要手動起始擷取和清除程式。

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

若要深入瞭解 Azure SQL 資料庫 中的異動數據擷取,請參閱此公開的數據集:

資料流程

下圖顯示使用 Azure SQL 資料庫 擷取異動數據擷取的主要資料流:

Diagram of a flow chart that depicts data flow for change data capture.

必要條件

權限

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

Azure SQL 資料庫 計算需求

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

針對 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 schema會為資料庫建立 、 cdc 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 角色之成員的使用者也必須是指定角色的成員。

若要針對指定 gating 角色的數據表啟用 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_scan和sp_cdc_cleanup_change_tables程式可讓您視需要觸發擷取和清除工作。

監視 CDC

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

CDC 自定義

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

  • 無法自定義 CDC 擷取和清除作業的頻率。
  • pollinginterval擷取和清除作業的 和 continuous 值不適用於 Azure SQL 資料庫。
  • cdc.cdc_jobs 數據表移除擷取作業專案並不會停止背景擷取作業。
  • 卸除清除作業專案會停止清除作業。
  • 資料表 cdc.cdc_jobs 位於架構中 cdc ,而不是 msdb

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

  • 查詢數據表以 cdc.cdc_jobs 取得目前的組態詳細數據。
  • maxtrans使用sp_cdc_change_job預存程式調整 和 maxscans 選項。
  • 視需要僱用 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 資料庫 內自動執行擷取和清除。 CDC 擷取作業每隔 20 秒執行一次,而清除作業會每小時執行一次

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

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

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

已知問題與限制

積極性記錄截斷

當您在 Azure SQL 資料庫 上啟用異動數據擷取 (CDC)時,會停用加速資料庫復原 (ADR) 的積極記錄截斷功能。 這是因為 CDC 掃描會存取資料庫交易記錄。 作用中交易會防止事務歷史記錄截斷,直到交易認可和 CDC 掃描趕上或交易中止為止。 這可能導致交易記錄比平常填得更滿且應受到監視,如此一來交易記錄就不會填滿。

啟用 CDC 時,建議您在建立或重建索引時使用可繼續的索引選項。 可繼續的索引不會讓長時間執行的交易保持開啟,而且允許在作業期間截斷記錄檔空間,以便進行更好的記錄空間管理。 如需詳細資訊,請參閱線上索引作業的指導方針 - 可繼續索引考量因素

Azure SQL 資料庫 服務層級

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

Azure SQL 資料庫 記錄限制

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

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

提示

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

擷取和清除自定義

無法在 Azure SQL Database 中設定 CDC 的擷取頻率和清除程序。 排程器會自動執行擷取和清除。

Azure SQL 資料庫 中的故障轉移

在本機或 GeoDR 故障轉移案例的情況下,如果您的資料庫已啟用 CDC,在故障轉移發生之後,擷取和清除數據變更的程式會自動發生在新的主資料庫上。

Microsoft Entra ID

注意

Microsoft Entra 標識符 先前稱為 Azure Active Directory (Azure AD)。

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

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

如果您以 Microsoft Entra 使用者身分在 Azure SQL 資料庫 中建立資料庫,則啟用 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 Entra 使用者身分在資料庫上啟用 CDC,則無法將時間點還原 (PITR) 還原至子核心 SLO。 將資料庫還原至與來源相同的或更高 SLO,然後視需要停用 CDC。

疑難排解

本節提供與 Azure SQL 資料庫 CDC 相關聯的指引和疑難解答步驟。 CDC 相關錯誤可能會阻礙擷取程式正常運作,並導致資料庫事務歷史記錄的擴充。

若要檢查這些錯誤,您可以查詢動態管理檢視 sys.dm_cdc_errorssys.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=1不應schema_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 schema建立資料庫的 、 cdc user、元數據表和其他系統物件。 在資料庫啟用 CDC 之後,您必須手動為個別數據表重新啟用 CDC。

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

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

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

資料庫空間管理

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

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

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