共用方式為


啟用和停用異動資料擷取 (SQL Server)

本主題描述如何啟用和停用資料庫和數據表的異動數據擷取。

啟用資料庫的異動數據擷取

在針對個別數據表建立擷取實例之前,固定伺服器角色的成員 sysadmin 必須先啟用資料庫以進行異動數據擷取。 這是藉由在資料庫內容中執行預存程式 sys.sp_cdc_enable_db (Transact-SQL) 來完成。 若要確定資料庫是否已啟用,請在 is_cdc_enabled 目錄檢視中查詢 sys.databases 資料行。

啟用異動數據擷取的資料庫時, cdc 會為資料庫建立架構、 cdc 使用者、元數據表和其他系統物件。 架構 cdc 包含異動數據擷取元數據數據表,而且在源數據表啟用異動數據擷取之後,個別變更數據表會做為變更數據的存放庫。 架構 cdc 也包含用來查詢變更數據的相關系統函式。

異動數據擷取需要獨佔使用 cdc 架構和 cdc 使用者。 如果架構或名為 cdc 的資料庫使用者目前存在於資料庫中,則在卸除或重新命名架構或使用者之前,無法為異動數據擷取啟用資料庫。

如需啟用資料庫的範例,請參閱啟用異動數據擷取的資料庫範本。

這很重要

若要在 SQL Server Management Studio 中找出範本,請移至 [ 檢視],按兩下 [ 範本總管],然後選取 [SQL Server 範本]。 異動數據擷取 是子資料夾。 在此資料夾下,您將找到本主題中參考的所有範本。 SQL Server Management Studio 工具列上也有 範本瀏覽器 圖示。

-- ====  
-- Enable Database for CDC template   
-- ====  
USE MyDB  
GO  
EXEC sys.sp_cdc_enable_db  
GO  

停用資料庫的異動數據擷取

固定伺服器角色的成員 sysadmin 可以在資料庫內容中執行預存程式 sys.sp_cdc_disable_db(Transact-SQL), 以停用資料庫的異動數據擷取。 停用資料庫之前,不需要停用個別數據表。 停用資料庫會移除所有相關的異動數據擷取元數據,包括 cdc 使用者和架構,以及異動數據擷取作業。 不過,由變更數據擷取技術所建立的任何過濾角色將不會自動移除,且必須明確刪除。 若要判斷資料庫是否已啟用,請查詢 is_cdc_enabled sys.databases 目錄檢視中的數據行。

如果啟用異動資料擷取的資料庫已卸除,系統就會自動移除異動資料擷取作業。

如需停用資料庫的範例,請參閱停用異動數據擷取的資料庫範本。

這很重要

若要在 SQL Server Management Studio 中找出範本,請移至 [ 檢視],按兩下 [ 範本總管],然後按下 [ SQL Server 範本]。 異動數據擷取 是子資料夾,您可以在其中找到本主題中參考的所有範本。 SQL Server Management Studio 工具列上也有 範本瀏覽器 圖示。

-- =======  
-- Disable Database for Change Data Capture template   
-- =======  
USE MyDB  
GO  
EXEC sys.sp_cdc_disable_db  
GO  

啟用數據表的異動數據擷取

啟用異動數據擷取的資料庫之後,固定資料庫角色的成員 db_owner 可以使用預存程式 sys.sp_cdc_enable_table建立個別源數據表的擷取實例。 若要判斷來源資料表是否已啟用異動資料擷取,請檢查 sys.tables 目錄檢視中的 is_tracked_by_cdc 資料行。

您可以在建立擷取執行個體時指定下列選項:

Columns in the source table to be captured

根據預設,系統會將來源資料表中的所有資料行識別為擷取資料行。 如果只需要追蹤數據行的子集,例如基於隱私權或效能考慮,請使用 @captured_column_list 參數來指定數據行的子集。

A filegroup to contain the change table.

根據預設,變更資料表位於資料庫的預設檔案群組中。 想要控制個別變更資料表位置的資料庫擁有者可以使用 @filegroup_name 參數,指定與擷取執行個體相關聯之變更資料表的特定檔案群組。 此指定的檔案群組必須已存在。 一般而言,建議將變更數據表放在與源數據表不同的檔案群組中。 Enable a Table Specifying Filegroup Option如需示範如何使用 @filegroup_name 參數的範例,請參閱範本。

-- =========  
-- Enable a Table Specifying Filegroup Option Template  
-- =========  
USE MyDB  
GO  
  
EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@role_name     = N'MyRole',  
@filegroup_name = N'MyDB_CT',  
@supports_net_changes = 1  
GO  

A role for controlling access to a change table.

指定角色的目的是要控制變更資料的存取權。 指定的角色可以是現有的固定伺服器角色或資料庫角色。 如果指定的角色不存在,則會自動建立該名稱的資料庫角色。 無論是sysadmin角色還是db_owner角色的成員,都擁有對變更數據表中數據的完整存取權。 所有其他用戶都必須具有源數據表所有擷取數據行的SELECT許可權。 此外,當指定角色時,非 sysadmin 角色或 db_owner 角色的使用者也必須是指定角色的成員。

如果您不想使用 gating 角色,請明確將 @role_name 參數設定為 NULL。 Enable a Table Without Using a Gating Role如需在沒有檢查角色的情況下啟用數據表的範例,請參閱範本。

-- =========  
-- Enable a Table Without Using a Gating Role template   
-- =========  
USE MyDB  
GO  
EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@role_name     = NULL,  
@supports_net_changes = 1  
GO  
  

A function to query for net changes.

擷取實例一律會包含一個表值函式,該函式用於傳回在定義時間間隔內發生的所有變更表專案。 此函式是透過將擷取執行個體名稱拼接至「cdc.fn_cdc_get_all_changes_」來命名的。 如需詳細資訊,請參閱 cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)

如果 @supports_net_changes 參數設為 1,捕獲實例也會產出淨變更函數。 此函數僅會針對在呼叫中指定之間隔內變更的每個不同資料列,傳回一個變更。 如需詳細資訊,請參閱 cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)

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

Enable a Table for All and Net Changes Queries如需示範使用這兩個查詢函式建立擷取實例的範例,請參閱範本。

-- =============  
-- Enable a Table for All and Net Changes Queries template   
-- =============  
USE MyDB  
GO  
EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@role_name     = N'MyRole',  
@supports_net_changes = 1  
GO  

備註

如果在具有現有主鍵的數據表上啟用異動數據擷取,而且 @index_name 參數不會用來識別替代的唯一索引,則異動數據擷取功能會使用主鍵。 若未先停用數據表的異動數據擷取,就不允許對主鍵進行後續變更。 不論設定異動資料擷取時是否要求淨變更查詢的支援,都是如此。 如果啟用異動資料擷取時,資料表沒有任何主索引鍵,則異動資料擷取就會忽略後續加入主索引鍵的作業。 由於異動資料擷取不會使用啟用資料表之後所建立的主索引鍵,因此您可以移除此索引鍵和索引鍵資料行,而且沒有任何限制。

停用資料表的變更數據擷取功能

固定資料庫角色的成員 db_owner 可以使用預存程式 sys.sp_cdc_disable_table來移除個別源數據表的擷取實例。 若要判斷目前來源資料表是否已啟用變更資料擷取,請檢查is_tracked_by_cdc資料行在sys.tables目錄檢視中的狀態。 如果進行停用之後,資料庫中沒有任何資料表啟用,系統也會移除異動資料擷取作業。

如果啟用了變更資料擷取的資料表被刪除,與該資料表相關聯的變更資料擷取中繼資料會自動被移除。

如需停用資料表的範例,請參閱「停用資料表的擷取執行個體」範本。

-- =====  
-- Disable a Capture Instance for a Table template   
-- =====  
USE MyDB  
GO  
EXEC sys.sp_cdc_disable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@capture_instance = N'dbo_MyTable'  
GO  

另請參閱

追蹤資料變更 (SQL Server)
關於異動資料擷取 (SQL Server)
處理變更資料 (SQL Server)
管理和監視異動資料擷取 (SQL Server)