Teilen über


sys.sp_cdc_enable_table (Transact-SQL)

Gilt für: SQL Server

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.

Änderungsdatenerfassung ist in jeder Edition von SQL Server nicht verfügbar. Eine Liste der Funktionen, die von den SQL Server-Editionen unterstützt werden, finden Sie unter Editionen und unterstützte Funktionen von SQL Server 2022.

Transact-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 = ] N'captured_column_list' ]
    [ , [ @filegroup_name = ] 'filegroup_name' ]
    [ , [ @allow_partition_switch = ] 'allow_partition_switch' ]
[ ; ]

Argumente

[ @source_schema = ] 'source_schema'

Der Name des Schemas, zu dem die Quelltabelle gehört. @source_schema ist "sysname" ohne Standard und kann nicht seinNULL.

[ @source_name = ] 'source_name'

Der Name der Quelltabelle, in der die Änderungsdatenerfassung aktiviert werden soll. @source_name ist "sysname" ohne Standard und kann nicht seinNULL.

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

[ @role_name = ] 'role_name'

Der Name der Datenbankrolle, die zum Torzugriff zum Ändern von Daten verwendet wird. @role_name ist "sysname" und muss angegeben werden. Wenn dies explizit festgelegt NULList, wird keine Gatingrolle verwendet, um den Zugriff auf die Änderungsdaten zu beschränken.

Wenn die Rolle derzeit vorhanden ist, wird sie verwendet. Wenn die Rolle nicht vorhanden ist, 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, eine Rolle innerhalb der Datenbank zu erstellen, schlägt der Vorgang der gespeicherten Prozedur fehl.

[ @capture_instance = ] 'capture_instance'

Der Name der Aufzeichnungsinstanz, die für die Benennung der instanzspezifischen Change Data Capture-Objekte verwendet wird. @capture_instance ist "sysname" und kann nicht seinNULL.

Wenn kein Name angegeben wird, 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 ein beliebiges Leerzeichen rechts neben der Zeichenfolge gekürzt.

Eine Quelltabelle kann maximal zwei Aufzeichnungsinstanzen aufweisen. Weitere Informationen finden Sie unter sys.sp_cdc_help_change_data_capture.

[ @supports_net_changes = ] supports_net_changes

Gibt an, ob die Unterstützung zum Abfragen von Nettoänderungen für diese Aufzeichnungsinstanz zu aktivieren ist. @supports_net_changes ist ein Bit mit einem Standardwert davon1, ob die Tabelle über einen Primärschlüssel verfügt oder die Tabelle über einen eindeutigen Index verfügt, der mithilfe des @index_name Parameters identifiziert wurde. Andernfalls wird der Parameter standardmäßig auf 0.

  • Wenn 0nur die Unterstützungsfunktionen zum Abfragen aller Änderungen generiert werden.
  • Wenn 1die Funktionen, die zum Abfragen von Nettoänderungen erforderlich sind, ebenfalls generiert werden.

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

Wenn @supports_net_changes festgelegt 1ist, wird für die Änderungstabelle ein zusätzlicher nicht gruppierter Index erstellt, und die Abfragefunktion für Nettoänderungen wird erstellt. Da dieser Index beibehalten werden muss, kann die Aktivierung von Nettoänderungen negative Auswirkungen auf die CDC-Leistung haben.

[ @index_name = ] 'index_name'

Entspricht dem Namen eines eindeutigen Indexes zur eindeutigen Identifizierung von Zeilen in der Quelltabelle. @index_name ist sysname und kann seinNULL. Wenn angegeben, muss @index_name ein gültiger eindeutiger Index in der Quelltabelle sein. Wenn @index_name angegeben ist, haben die identifizierten Indexspalten Vorrang vor definierten Primärschlüsselspalten als eindeutiger Zeilenbezeichner für die Tabelle.

[ @captured_column_list = ] N'captured_column_list'

Identifiziert die Quelltabellenspalten, die in die Änderungstabelle aufzunehmen sind. @captured_column_list ist nvarchar(max) und kann seinNULL. Wenn NULLalle Spalten in der Änderungstabelle enthalten sind.

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 Trennzeichen getrennte Liste von Spaltennamen. Einzelne Spaltennamen in der Liste können optional mit doppelten Anführungszeichen () oder eckigen Klammern (""[]) zitiert werden. Wenn ein Spaltenname ein eingebettetes Komma enthält, muss er in Anführungszeichen eingeschlossen sein.

@captured_column_list dürfen die folgenden reservierten Spaltennamen nicht enthalten: __$start_lsn, , __$end_lsn, , __$seqval, __$operationund __$update_mask.

[ @filegroup_name = ] 'filegroup_name'

Die Dateigruppe, die für die änderungstabelle verwendet werden soll, die für die Aufnahmeinstanz erstellt wurde. @filegroup_name ist sysname und kann seinNULL. Wenn angegeben, muss @filegroup_name für die aktuelle Datenbank definiert werden. Wenn NULLdie Standarddateigruppe verwendet wird.

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 PARTITION-Befehl von ALTER TABLE für eine Tabelle ausgeführt werden kann, die für Change Data Capture aktiviert ist. @allow_partition_switch ist bit, mit einem Standardwert von 1.

Bei nicht partitionierten Tabellen lautet die Schaltereinstellung immer 1, und die tatsächliche Einstellung wird ignoriert. Wenn der Switch explizit auf 0 eine nicht partitionierte Tabelle festgelegt ist, wird warnung 22857 ausgegeben, um anzugeben, dass die Switcheinstellung ignoriert wurde. Wenn der Switch explizit auf eine partitionierte Tabelle festgelegt 0 ist, wird die Warnung 22356 ausgegeben, um anzugeben, dass Partitionswechselvorgänge in der Quelltabelle unzulässig sind. Wenn die Switch-Einstellung entweder explizit auf 1 oder standardmäßig 1 festgelegt ist und die aktivierte Tabelle partitioniert wird, wird warnung 22855 ausgegeben, um anzugeben, dass Partitionsswitche nicht blockiert werden. Wenn Partitionswechsel auftreten, werden die Änderungen, die sich aus dem Switch ergeben, nicht nachverfolgt. Dies führt zu Dateninkonsistenzen, wenn die Änderungsdaten genutzt werden.

SWITCH PARTITION ist ein Metadatenvorgang, verursacht jedoch Datenänderungen. Die Datenänderungen, die diesem Vorgang zugeordnet sind, werden nicht in den Änderungsdatenerfassungsänderungstabellen erfasst. Beispiel: An einer Tabelle mit drei Partitionen werden Änderungen vorgenommen. Der Erfassungsprozess verfolgt Vorgänge zum Einfügen, Aktualisieren und Löschen des Benutzers, die für die Tabelle ausgeführt werden. Wenn eine Partition jedoch zu einer anderen Tabelle gewechselt wird (z. B. zum Ausführen eines Massenlöschvorgangs), werden die Zeilen, die als Teil dieses Vorgangs verschoben wurden, nicht als gelöschte Zeilen in der Änderungstabelle erfasst. Wenn der Tabelle auch eine neue Partition mit vorgefüllten Zeilen hinzugefügt wird, werden diese Zeilen nicht in der Änderungstabelle angezeigt. Dies kann zu inkonsistenten Daten führen, wenn die Änderungen von einer Anwendung belegt und auf ein Ziel angewendet werden.

Wenn Sie die Partitionsumschaltung auf SQL Server aktivieren, benötigen Sie in Naher Zukunft möglicherweise auch Vorgänge zum Teilen und Zusammenführen. Stellen Sie vor dem Ausführen eines Geteilten oder Zusammenführens für eine replizierte oder CDC-aktivierte Tabelle sicher, dass die fragliche Partition keine ausstehenden replizierten Befehle enthält. 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 der Protokollleser- oder CDC-Aufnahmeauftrag nicht verarbeitet hat, oder wenn DML-Vorgänge auf einer Partition einer replizierten oder CDC-aktivierten Tabelle ausgeführt werden, während ein Teil- oder Zusammenführungsvorgang ausgeführt wird (mit derselben Partition), kann es zu einem Verarbeitungsfehler (Fehler 608 – Kein Katalogeintrag für partitions-ID gefunden) mit Protokollleser-Agent oder CDC-Aufnahmeauftrag 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 (erfolgreich) oder 1 Fehler.

Resultset

Keine.

Hinweise

Bevor Sie eine Tabelle für Change Data Capture aktivieren können, muss die Datenbank aktiviert sein. Um festzustellen, ob die Datenbank für die Änderungsdatenerfassung aktiviert ist, fragen Sie die is_cdc_enabled Spalte in der Katalogansicht "sys.databases " ab. Verwenden Sie zum Aktivieren der Datenbank die sys.sp_cdc_enable_db gespeicherten Prozedur.

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 vom @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 außerdem die Erfassungs- und Bereinigungsaufträge für die Datenbank, wenn die Quelltabelle die erste Tabelle in der Datenbank ist, die für die Datenerfassung von Änderungen aktiviert werden soll, und für die Datenbank sind keine Transaktionspublikationen vorhanden. Sie legt die Spalte in der Katalogansicht "sys.tables" auf .it sets the is_tracked_by_cdc column in the sys.tables catalog view to 1.

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

Berechtigungen

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

Beispiele

A. Aktivieren der Änderungsdatenerfassung durch Angabe nur erforderlicher Parameter

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

USE AdventureWorks2022;
GO

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

B. Aktivieren der Änderungsdatenerfassung durch Angabe 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 AdventureWorks2022;
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