CDC.<>capture_instance_CT (Transact-SQL)
Gilt für: SQL Server Azure SQL-Datenbank Azure SQL Managed Instance
Die Änderungstabelle, die erstellt wurde, wenn die Datenerfassung für Änderungen in einer 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 des Quelltabellennamens im Format schema_table ist. Wenn die Tabelle "Person.Address " in der AdventureWorks-Beispieldatenbank beispielsweise für die Datenerfassung von Änderungen aktiviert ist, wäre der abgeleitete Änderungstabellenname 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 in der Quelltabelle zwei Zeilen entfernt, enthält die Änderungstabelle zwei Zeilen, die jeweils denselben __$start_lsn Wert aufweisen. |
__$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) ist 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 basierend auf den Spalten ordinalen der Änderungstabelle, 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 bei FIX: Die Änderungstabelle ist nach aktivierung der Änderungsdatenerfassung für eine Microsoft SQL Server-Datenbank fälschlicherweise für aktualisierte Zeilen sortiert. Weitere Informationen finden Sie unter CDC-Funktionalität, die nach dem Upgrade auf das neueste CU für SQL Server 2012, 2014 und 2016 unterbrochen werden kann.
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 vom Datentyp "Image", "Text" und "ntext " werden immer einen NULL-Wert zugewiesen, wenn __$operation = 1 oder __$operation = 3. Spalten vom Datentyp varbinary(max), varchar(max) oder nvarchar(max) werden einem NULL-Wert zugewiesen, wenn __$operation = 3, es sei denn, die Spalte wurde während der Aktualisierung geändert. Wenn __$operation = 1, werden diese Spalten zum Zeitpunkt des Löschens ihrem Wert zugewiesen. Berechnete Spalten, die in einer Aufnahmeinstanz enthalten sind, weisen immer den Wert NULL auf.
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. Wenn Sie diese Größe erhöhen möchten, um größere Branchendaten zu unterstützen, verwenden Sie die Option "Konfigurieren der maximalen Größe der Serverkonfiguration für Text repl", 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. Hinzufügen oder Ablegen 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 diese 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.
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 kleinen Bereich passt, -32.768 auf 32.767.
Führen Sie denselben Updatevorgang in der Änderungstabelle für die entsprechende Spalte aus.
Ä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 eine oder zwei Zeilen hinzu, um die Änderung aufzuzeichnen. Einträge werden der Änderungstabelle in derselben Reihenfolge hinzugefügt, in der sie der Quelltabelle zugesichert wurden. Dies bedeutet, dass der Commit von Änderungstabelleneinträgen in der Regel für eine Gruppe von Änderungen ausgeführt werden muss, anstatt pro Eintrag ausgeführt zu werden.
Ein Einfügevorgang führt zu einer Zeile, die der Änderungstabelle hinzugefügt wird; Ein Löschvorgang führt zu einer Zeile, die der Änderungstabelle hinzugefügt wird; Wenn SQL Server eine Aktualisierung als "verzögertes Update" implementiert, was als Lösch- und Einfügevorgängepaar bedeutet, führt der Aktualisierungsvorgang zu zwei Zeilen, die der Änderungstabelle 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 kein Update als "verzögertes Update" implementiert, führt der Aktualisierungsvorgang zu zwei Zeilen, die der Änderungstabelle hinzugefügt werden: die erste Zeile, die die erfassten Daten vor der Aktualisierung widerspiegelt, und die zweite Zeile, die die erfassten Daten nach der Aktualisierung widerspiegelt.
Innerhalb des Änderungstabelleneintrags wird die Spalte __$start_lsn verwendet, um den Commit-LSN aufzuzeichnen, der der Änderung der Quelltabelle zugeordnet ist, die Spalte __$command_id wird verwendet, um die Änderung innerhalb der Transaktion zu sortieren, und die Spalte __$operation 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)