Cdc.<>capture_instance_CT (Transact-SQL)

Gilt für:SQL ServerAzure SQL-DatenbankAzure SQL Managed Instance

Die Änderungstabelle, die erstellt wird, wenn die Änderungsdatenerfassung für eine Quelltabelle aktiviert ist. Für jeden Einfüge- oder Löschvorgang, der in der Quelltabelle ausgeführt wird, gibt die Tabelle eine Zeile zurück, für jeden Updatevorgang in der Quelltabelle gibt sie zwei Zeilen zurück. Wenn der Name der Änderungstabelle zum Zeitpunkt der Aktivierung der Quelltabelle nicht angegeben wird, wird der Name abgeleitet. Das Format des Namens ist cdc. capture_instance_CT wobei capture_instance der Schemaname der Quelltabelle und der Name der Quelltabelle im format schema_table ist. Wenn beispielsweise die Tabelle Person.Address in der AdventureWorks-Beispieldatenbank für die Änderungsdatenerfassung aktiviert ist, wird der Name der abgeleiteten Änderungstabelle cdc.Person_Address_CT.

Es wird empfohlen, die Systemtabellen nicht direkt abfragen. Führen Sie stattdessen die Funktionen cdc.fn_cdc_get_all_changes_<capture_instance> und cdc.fn_cdc_get_net_changes_<capture_instance> aus.

Spaltenname Datentyp BESCHREIBUNG
__$start_lsn binary(10) Protokollfolgenummer (LSN, Log Sequence Number), die dem Commit für die Änderung zugeordnet wurde.

Alle Änderungen, für die ein Commit in derselben Transaktion ausgeführt wurde, verwenden dieselbe Commit-LSN. Wenn beispielsweise ein Löschvorgang für die Quelltabelle zwei Zeilen entfernt, enthält die Änderungstabelle zwei Zeilen mit jeweils demselben __$start_lsn-Wert .
__$end_lsn binary(10) Nur für Informationszwecke identifiziert. Wird nicht unterstützt. Zukünftige Kompatibilität wird nicht sichergestellt.

In SQL Server 2012 (11.x) lautet diese Spalte immer NULL.
__$seqval binary(10) Sequenz des Vorgangs, wie im Transaktionsprotokoll dargestellt. Sollte nicht für die Bestellung verwendet werden. Verwenden Sie stattdessen die Spalte __$command_id .
__$operation int Identifiziert den Vorgang der Datenbearbeitungssprache (Data Manipulation Language, DML), der der Änderung zugeordnet ist. Dabei kann es sich um eine der folgenden Methoden handeln:

1 = Löschen

2 = Einfügen

3 = Aktualisieren (alte Werte)

Spaltendaten verfügen vor der Ausführung der UPDATE-Anweisung über Zeilenwerte.

4 = Aktualisieren (neue Werte)

Spaltendaten verfügen nach der Ausführung der UPDATE-Anweisung über Zeilenwerte.
__$update_mask varbinary(128) Eine Bitmaske, die auf den Spalten ordinalen der Änderungstabelle basiert, die die geänderten Spalten identifiziert.
<erfasste Quelltabellenspalten> Variiert Bei den verbleibenden Spalten in der Änderungstabelle handelt es sich um die Spalten aus der Quelltabelle, die beim Erstellen der Aufzeichnungsinstanz als aufgezeichnete Tabellen identifiziert wurden. Wenn in der Liste der aufgezeichneten Spalten keine Spalten angegeben wurden, werden alle Spalten in der Quelltabelle in diese Tabelle aufgenommen.
__$command_id int Verfolgt die Reihenfolge der Vorgänge innerhalb einer Transaktion.

Hinweise

Die __$command_id Spalte wurde in einem kumulativen Update in den Versionen 2012 bis 2016 eingeführt. Versions- und Downloadinformationen finden Sie im KB-Artikel 3030352 unter FIX: Die Änderungstabelle wird für aktualisierte Zeilen falsch sortiert, nachdem Sie die Änderungsdatenerfassung für eine Microsoft SQL Server-Datenbank aktiviert haben. Weitere Informationen finden Sie unter CDC-Funktionalität kann nach dem Upgrade auf die neueste CU für SQL Server 2012, 2014 und 2016 unterbrochen werden.

Datentypen von aufgezeichneten Spalten

Die in dieser Tabelle enthaltenen aufgezeichneten Spalten haben denselben Datentyp und Wert wie die entsprechenden Quellspalten. Hierbei gelten folgende Ausnahmen:

  • Zeitstempelspalten werden als binary(8) definiert.

  • Identitätsspalten werden entweder als int oder bigint definiert.

Die Werte in diesen Spalten sind jedoch mit den Quellspaltenwerten identisch.

LOB (Large Object)-Datentypen

Spalten des Datentyps image, text und ntext erhalten immer einen NULL-Wert , wenn __$operation = 1 oder __$operation = 3 ist. Spalten des Datentyps varbinary(max), varchar(max) oder nvarchar(max) wird ein NULL-Wert zugewiesen, wenn __$operation = 3 ist, es sei denn, die Spalte hat sich während der Aktualisierung geändert. Wenn __$operation = 1, werden diesen Spalten ihr Wert zur Zeit der Löschung zugewiesen. Berechnete Spalten, die in einer Erfassung enthalten sind, instance immer den Wert NULL aufweisen.

Standardmäßig können einer aufgezeichneten Spalte in einer einzelnen Anweisung vom Typ INSERT, UPDATE, WRITETEXT oder UPDATETEXT maximal 65.536 Bytes oder 64 KB hinzugefügt werden. Um diese Größe zur Unterstützung größerer LOB-Daten zu erhöhen, verwenden Sie die Serverkonfigurationsoption Konfigurieren der maximalen Textreplgröße , um eine größere maximale Größe anzugeben. Weitere Informationen finden Sie unter Konfigurieren der Serverkonfigurationsoption max text repl size.

Änderungen mithilfe der Datendefinitionssprache (Data Definition Language, DDL)

DDL-Änderungen an der Quelltabelle, z. B. das Hinzufügen oder Löschen von Spalten, werden in der cdc.ddl_history Tabelle aufgezeichnet. Diese Änderungen werden nicht auf die Änderungstabelle angewendet. Die Definition der Änderungstabelle bleibt also konstant. Beim Einfügen von Zeilen in die Änderungstabelle ignoriert der Erfassungsprozess die Spalten, die nicht in der erfassten Spaltenliste angezeigt werden, die der Quelltabelle zugeordnet ist. Falls in der Liste der aufgezeichneten Spalten eine Spalte angezeigt wird, die sich nicht mehr in der Quelltabelle befindet, wird dieser Spalte ein NULL-Wert zugewiesen.

Das Ändern des Datentyps einer Spalte in der Quelltabelle wird auch in der cdc.ddl_history-Tabelle aufgezeichnet. Durch diese Änderung wird die Definition der Änderungstabelle jedoch nicht geändert. Der Datentyp der aufgezeichneten Spalte in der Änderungstabelle wird geändert, wenn während des Aufzeichnungsvorgangs der Protokolldatensatz für die an der Quelltabelle vorgenommenen Änderungen gefunden wird.

Falls Sie den Datentyp einer aufgezeichneten Spalte in der Quelltabelle so ändern müssen, dass die Größe des Datentyps verringert wird, stellen Sie mithilfe des folgenden Verfahrens sicher, dass die entsprechende Spalte in der Änderungstabelle erfolgreich geändert werden kann.

  1. Aktualisieren Sie in der Quelltabelle die Werte in der zu ändernden Spalte, sodass ihre Größe für die geplante Datentypgröße geeignet ist. Wenn Sie beispielsweise den Datentyp von int in smallint ändern, aktualisieren Sie die Werte auf eine Größe, die in den Smallint-Bereich passt, -32.768 bis 32.767.

  2. Führen Sie denselben Updatevorgang in der Änderungstabelle für die entsprechende Spalte aus.

  3. Ändern Sie die Quelltabelle, indem Sie den neuen Datentyp angeben. Die Datentypänderung wird erfolgreich an die Änderungstabelle weitergegeben.

Änderungen mithilfe der Datenbearbeitungssprache (Data Manipulation Language, DDL)

Wenn in einer Change Data Capture-aktivierten Quelltabelle Einfüge-, Update- und Löschvorgänge ausgeführt werden, wird im Datenbanktransaktionsprotokoll ein Datensatz dieser DML-Vorgänge angezeigt. Der Änderungsdatenerfassungsprozess ruft Informationen zu diesen Änderungen aus dem Transaktionsprotokoll ab und fügt der Änderungstabelle entweder eine oder zwei Zeilen hinzu, um die Änderung aufzuzeichnen. Einträge werden der Änderungstabelle in der gleichen Reihenfolge hinzugefügt, in der sie für die Quelltabelle festgelegt wurden. Allerdings muss der Commit von Änderungstabelleneinträgen in der Regel für eine Gruppe von Änderungen statt für jeden Eintrag ausgeführt werden.

Ein Einfügevorgang führt dazu, dass der Änderungstabelle eine Zeile hinzugefügt wird. ein Löschvorgang führt dazu, dass der Änderungstabelle eine Zeile hinzugefügt wird. wenn SQL Server ein Update als "verzögertes Update" implementiert, d. h. als Paar von Lösch- und Einfügevorgängen, führt der Aktualisierungsvorgang dazu, dass der Änderungstabelle zwei Zeilen hinzugefügt werden: die erste Zeile, die das Löschen der erfassten Daten widerspiegelt, und die zweite Zeile, die das Einfügen der aktualisierten, erfassten Daten widerspiegelt; wenn SQL Server implementiert ein Update nicht als "verzögertes Update". Der Aktualisierungsvorgang führt dazu, dass der Änderungstabelle zwei Zeilen hinzugefügt werden: die erste Zeile, die die erfassten Daten vor dem Update darstellt, und die zweite Zeile, die die erfassten Daten nach dem Update widerspiegelt.

Innerhalb des Änderungstabelleneintrags wird die Spalte __$start_lsn verwendet, um den Commit-LSN aufzuzeichnen, der der Änderung an der Quelltabelle zugeordnet ist, die Spalte __$command_id wird verwendet, um die Änderung innerhalb der Transaktion zu ordnen, und die _ _$-Spalte wird verwendet, um den ausgeführten Vorgang aufzuzeichnen. In Kombination können diese Metadatenspalten verwendet werden, um sicherzustellen, dass die Reihenfolge der Änderungen beim Commit beibehalten wird. Da der Erfassungsprozess seine Änderungsinformationen aus dem Transaktionsprotokoll abruft, ist es wichtig zu beachten, dass Änderungstabelleneinträge nicht synchron mit den entsprechenden Quelltabellenänderungen angezeigt werden. Stattdessen werden die Änderungen asynchron angezeigt, nachdem die relevanten Änderungseinträge aus dem Transaktionsprotokoll vom Aufzeichnungsprozess verarbeitet wurden.

Bei Einfüge- und Löschvorgängen werden alle Bits in der Updatemaske festgelegt. Bei Updatevorgängen wird die Updatemaske sowohl in den alten als auch in den neuen Zeilen des Updates entsprechend den Spalten geändert, die während des Updates geändert wurden.

Weitere Informationen

sys.sp_cdc_enable_table (Transact-SQL)
sys.sp_cdc_get_ddl_history (Transact-SQL)