sys.sp_cdc_enable_table (Transact-SQL)

Gilt für:yesSQL Server (alle unterstützten Versionen)

Aktiviert Change Data Capture für die angegebene Quelltabelle in der aktuellen Datenbank. Wenn eine Tabelle für Change Data Capture aktiviert ist, wird für jeden Vorgang der Datenbearbeitungssprache (Data Manipulation Language, DML), der auf die Tabelle angewendet wird, ein Datensatz in das Transaktionsprotokoll geschrieben. Der Change Data Capture-Prozess ruft diese Informationen aus dem Protokoll ab und schreibt sie in die Änderungstabellen, auf die über eine Reihe von Funktionen zugegriffen wird.

Change Data Capture ist nicht in jeder Edition von MicrosoftSQL Server. Eine Liste der Funktionen, die von den SQL Server-Editionen unterstützt werden, finden Sie unter Von den SQL Server 2016-Editionen unterstützte Funktionen.

Topic link iconTransact-SQL-Syntaxkonventionen

Syntax

  
sys.sp_cdc_enable_table   
  [ @source_schema = ] 'source_schema',   
  [ @source_name = ] 'source_name' ,  [,[ @capture_instance = ] 'capture_instance' ]  
  [,[ @supports_net_changes = ] supports_net_changes ]  
  , [ @role_name = ] 'role_name'  
  [,[ @index_name = ] 'index_name' ]  
  [,[ @captured_column_list = ] 'captured_column_list' ]  
  [,[ @filegroup_name = ] 'filegroup_name' ]  
  [,[ @allow_partition_switch = ] 'allow_partition_switch' ]  
  [;]  

Argumente

[ @source_schema = ] 'source_schema' Ist der Name des Schemas, in dem die Quelltabelle gehört. source_schema ist Sysname ohne Standard und kann nicht NULL sein.

[ @source_name = ] 'source_name' Ist der Name der Quelltabelle, auf der Die Datenaufnahme aktiviert werden soll. source_name ist Sysname ohne Standard und kann nicht NULL sein.

source_name muss in der aktuellen Datenbank vorhanden sein. Tabellen im cdc-Schema können nicht für die Datenaufnahme aktiviert werden.

[ @role_name = ] 'role_name' Ist der Name der Datenbankrolle, die verwendet wird, um den Zugriff auf Daten zu schützen. role_name ist sysname und muss angegeben werden. Wenn der Parameter explizit auf NULL festgelegt ist, wird keine Gatingrolle verwendet, um den Zugriff auf Änderungsdaten einzuschränken.

Wenn die Rolle derzeit vorhanden ist, wird sie verwendet. Ist die Rolle nicht vorhanden, wird versucht, eine Datenbankrolle mit dem angegebenen Namen zu erstellen. Vor dem Versuch zur Erstellung der Rolle wird der Rollenname um die in der Zeichenfolge rechts befindlichen Leerstellen gekürzt. Wenn der Aufrufer nicht berechtigt ist, Rollen in der Datenbank zu erstellen, tritt bei der gespeicherten Prozedur ein Fehler auf.

[ @capture_instance = ] 'capture_instance' Ist der Name der Aufnahmeinstanz, die zum Benennen von instanzspezifischen Änderungsdatenerfassungsobjekten verwendet wird. capture_instance ist sysname und kann nicht NULL sein.

Wenn nicht angegeben, wird der Name aus dem Quellschemanamen und dem Quelltabellennamen im Format schemaname_sourcename abgeleitet. capture_instance darf 100 Zeichen nicht überschreiten und muss innerhalb der Datenbank eindeutig sein. Unabhängig davon, ob angegeben oder abgeleitet, wird capture_instance auf jeden Leerraum rechts neben der Zeichenfolge zugeschnitten.

Eine Quelltabelle kann maximal zwei Aufzeichnungsinstanzen aufweisen. Weitere Informationen finden Sie unter sys.sp_cdc_help_change_data_capture (Transact-SQL).

[ @supports_net_changes = ] supports_net_changes Gibt an, ob die Abfrage für Net-Änderungen für diese Aufnahmeinstanz aktiviert werden soll. supports_net_changes ist bit mit einem Standard von 1, wenn die Tabelle über einen Primärschlüssel verfügt oder die Tabelle einen eindeutigen Index aufweist, der mithilfe des @index_name Parameters identifiziert wurde. Andernfalls hat der Parameter den Standardwert 0.

Bei 0 werden nur die Unterstützungsfunktionen zum Abfragen aller Änderungen generiert.

Bei 1 werden auch die Funktionen generiert, die zum Abfragen der Nettoänderungen erforderlich sind.

Wenn supports_net_changes auf 1 festgelegt ist, muss index_name angegeben werden, oder die Quelltabelle muss über einen definierten Primärschlüssel verfügen.

[ @index_name = ] 'index_name_' Der Name eines eindeutigen Indexes, der verwendet werden soll, um Zeilen in der Quelltabelle eindeutig zu identifizieren. index_name ist sysname und kann NULL sein. Wenn angegeben, muss index_name ein gültiger eindeutiger Index in der Quelltabelle sein. Wenn index_name angegeben wird, hat die identifizierten Indexspalten Vorrang vor allen definierten Primärschlüsselspalten als eindeutiger Zeilenbezeichner für die Tabelle.

[ @captured_column_list = ] 'captured_column_list' Identifiziert die Quelltabellenspalten, die in die Änderungstabelle einbezogen werden sollen. captured_column_list ist nvarchar(max) und kann NULL sein. Wenn der Wert NULL ist, werden alle Spalten in der Änderungstabelle eingeschlossen.

Spaltennamen müssen gültige Spalten in der Quelltabelle sein. Spalten, die in einem Primärschlüsselindex oder in einem durch index_name definierten Index definiert sind, müssen einbezogen werden.

captured_column_list ist eine durch Komma getrennte Liste von Spaltennamen. Einzelne Spaltennamen innerhalb der Liste können optional mit doppelten Anführungszeichen ("") oder eckigen Klammern ([]) angegeben werden. Wenn ein Spaltenname ein eingebettetes Komma enthält, muss er in Anführungszeichen eingeschlossen sein.

captured_column_list kann nicht die folgenden reservierten Spaltennamen enthalten: __$start_lsn, __$end_lsn, __$seqval, __$operation und __$update_mask.

[ @filegroup_name = ] 'filegroup_name' Ist die Dateigruppe, die für die für die Aufnahmeinstanz erstellte Änderungstabelle verwendet werden soll. filegroup_name ist sysname und kann NULL sein. Wenn angegeben, muss filegroup_name für die aktuelle Datenbank definiert werden. Wenn der Wert NULL ist, wird die Standarddateigruppe verwendet.

Es wird empfohlen, eine separate Dateigruppe für Change Data Capture-Änderungstabellen zu erstellen.

[ @allow_partition_switch = ] 'allow_partition_switch' Gibt an, ob der SWITCH-PARTITIONsbefehl von ALTER TABLE für eine Tabelle ausgeführt werden kann, die für die Änderungsdatenerfassung aktiviert ist. allow_partition_switch ist bit, mit einer Standardeinstellung von 1.

Bei nicht partitionierten Tabellen lautet die Schaltereinstellung immer 1, und die tatsächliche Einstellung wird ignoriert. Wenn der Schalter für eine nicht partitionierte Tabelle explizit auf 0 festgelegt ist, wird Warnung 22857 ausgegeben. Dies zeigt an, dass die Schaltereinstellung ignoriert wurde. Wenn der Schalter für eine partitionierte Tabelle explizit auf 0 festgelegt ist, wird die Warnung 22356 ausgegeben. Diese zeigt an, dass SWITCH PARTITION-Vorgänge für die Quelltabelle nicht zulässig sind. Wenn die Schaltereinstellung entweder explizit auf 1 festgelegt und der Standardwert 1 zugelassen und die aktivierte Tabelle partitioniert ist, wird die Warnung 22855 ausgegeben. Diese zeigt an, dass Partitionsschalter nicht blockiert werden. Falls Partitionsschalter auftreten, werden die aus dem Schalter resultierenden Änderungen von Change Data Capture nicht nachverfolgt. Dies führt bei der Nutzung der Änderungsdaten zu Inkonsistenzen.

Wichtig

SWITCH PARTITION ist ein Metadatenvorgang, verursacht jedoch Datenänderungen. Die mit diesem Vorgang verbundenen Datenänderungen werden nicht in den Change Data Capture-Änderungstabellen aufgezeichnet. Beispiel: An einer Tabelle mit drei Partitionen werden Änderungen vorgenommen. Mit dem Aufzeichnungsprozess werden Einfüge-, Update- und Löschvorgänge verfolgt, die Benutzer in der Tabelle ausführen. Wenn jedoch eine Partition in eine andere Tabelle ausgelagert wird (z. B. zur Durchführung einer Massenlöschung), werden die verschobenen Zeilen in der Änderungstabelle nicht als gelöschte Zeilen aufgezeichnet. Wenn der Tabelle eine neue Partition mit vorab ausgefüllten Zeilen hinzugefügt wird, werden diese Zeilen auch nicht in der Änderungstabelle erfasst. Dies kann zu inkonsistenten Daten führen, wenn die Änderungen von einer Anwendung belegt und auf ein Ziel angewendet werden.

Hinweis

Wenn Sie über die aktuelle Version Partitionswechsel für SQL Server 2008 R2 aktivieren, benötigen Sie möglicherweise schon in naher Zukunft auch Teilungs- und Mergevorgänge. Stellen Sie vor dem Ausführen von Teilungs- oder Zusammenführungsvorgängen in replizierten oder CDC-fähigen Tabellen sicher, dass für die fragliche Partition keine replizierten Befehle ausstehen. Sie sollten außerdem sicherstellen, dass für die Partition während der Teilungs- und Mergevorgänge keine DML-Vorgänge ausgeführt werden. Wenn Transaktionen vorhanden sind, die nicht vom Protokollleser oder CDC-Erfassungsauftrag verarbeitet wurden, oder DML-Vorgänge für eine Partition einer replizierten oder CDC-fähigen Tabelle ausgeführt werden, während ein Teilungs- oder Zusammenführungsvorgang stattfindet (an dem die gleiche Partition beteiligt ist), kann das zu einem Verarbeitungsfehler (Fehler 608 – Kein Katalogeintrag für die Partitions-ID gefunden) beim Protokolllese-Agent oder CDC-Erfassungsauftrag führen. Um den Fehler zu beheben, ist möglicherweise eine erneute Initialisierung des Abonnements oder das Deaktivieren von CDC für diese Tabelle oder Datenbank erforderlich.

Rückgabecodewerte

0 (Erfolg) oder 1 (Fehler)

Resultsets

Keine

Bemerkungen

Bevor Sie eine Tabelle für Change Data Capture aktivieren können, muss die Datenbank aktiviert sein. Um zu ermitteln, ob die Datenbank für die Datenaufnahme aktiviert ist, abfragen Sie die spalte is_cdc_enabled in der Katalogansicht "sys.database ". Verwenden Sie zum Aktivieren der Datenbank die gespeicherte Prozedur sys.sp_cdc_enable_db .

Wenn Change Data Capture für eine Tabelle aktiviert wird, werden eine Änderungstabelle und eine oder zwei Abfragefunktionen generiert. Die Änderungstabelle dient als Repository für die Änderungen der Quelltabelle, die durch den Aufzeichnungsprozess aus dem Transaktionsprotokoll extrahiert wurden. Die Abfragefunktionen werden verwendet, um Daten aus der Änderungstabelle zu extrahieren. Die Namen dieser Funktionen werden auf folgende Weise aus dem capture_instance-Parameter abgeleitet:

  • Alle Änderungen funktionieren: cdc.fn_cdc_get_all_changes_<capture_instance>

  • Net changes function: cdc.fn_cdc_get_net_changes_<capture_instance>

sys.sp_cdc_enable_table erstellt auch die Erfassungs- und Bereinigungsaufträge für die Datenbank, wenn die Quelltabelle die erste Tabelle in der Datenbank ist, die für die Datenerfassung aktiviert werden soll, und für die Datenbank sind keine Transaktionsveröffentlichungen vorhanden. Sie legt die spalte is_tracked_by_cdc in der Katalogansicht "sys.tables " auf 1 fest.

Hinweis

SQL Server-Agent muss nicht ausgeführt werden, wenn die Datenaufnahme für eine Tabelle aktiviert ist. Der Aufnahmevorgang verarbeitet jedoch nicht das Transaktionsprotokoll und schreibt Einträge in die Änderungstabelle, es sei denn, SQL Server-Agent wird ausgeführt.

Berechtigungen

Hierfür ist die Mitgliedschaft in der festen Datenbankrolle db_owner erforderlich.

Beispiele

A. Aktivieren von Change Data Capture durch das Angeben von nur erforderlichen Parametern

Im folgenden Beispiel wird Change Data Capture für die HumanResources.Employee-Tabelle aktiviert. Nur die erforderlichen Parameter werden angegeben.

USE AdventureWorks2012;  
GO  
EXECUTE sys.sp_cdc_enable_table  
    @source_schema = N'HumanResources'  
  , @source_name = N'Employee'  
  , @role_name = N'cdc_Admin';  
GO  

B. Aktivieren von Change Data Capture durch das Angeben zusätzlicher optionaler Parameter

Im folgenden Beispiel wird Change Data Capture für die HumanResources.Department-Tabelle aktiviert. Alle Parameter außer @allow_partition_switch werden angegeben.

USE AdventureWorks2012;  
GO  
EXEC sys.sp_cdc_enable_table  
    @source_schema = N'HumanResources'  
  , @source_name = N'Department'  
  , @role_name = N'cdc_admin'  
  , @capture_instance = N'HR_Department'   
  , @supports_net_changes = 1  
  , @index_name = N'AK_Department_Name'   
  , @captured_column_list = N'DepartmentID, Name, GroupName'   
  , @filegroup_name = N'PRIMARY';  
GO  

Weitere Informationen

sys.sp_cdc_disable_table (Transact-SQL)
sys.sp_cdc_help_change_data_capture (Transact-SQL)
<cdc.fn_cdc_get_all_changes_capture_instance> (Transact-SQL)
<cdc.fn_cdc_get_net_changes_capture_instance> (Transact-SQL)
sys.sp_cdc_help_jobs (Transact-SQL)