Welche Tabellen sind von Change Data Capture betroffen?

7

Wir möchten Change Data Capture in SQL 2012 verwenden. Wir versuchen herauszufinden, ob es eine einfache Möglichkeit gibt, herauszufinden, welche Tabellen von einem bestimmten lsn geändert wurden. Gibt es eine eingebaute Funktion oder müssten wir jede cdc-Tabelle abfragen, um zu sehen, ob sich die lsn dort befindet?

UPDATE, um ein bisschen mehr darüber zu erklären, was wir versuchen:

Wir versuchen, einen Prozess zu erstellen, der die CDC-Daten für alle Tabellen in der Datenbank überprüft (denken Sie an 100er). Dieser Prozess wird nach einem Zeitplan ausgeführt und kennt den letzten lsn, den er verarbeitet hat. Wenn es läuft, wollen wir etwas mit jeder der cdc-Tabellen machen , die sich seit dem letzten aufgezeichneten lsn geändert haben .

Wir könnten das überprüfen fn_cdc_get_all_changes_dbo_tablename(@lastlsn, @currentlsn, 'all'), aber das Problem dabei ist, dass wir es 100 Mal ausführen müssten (einmal für jede Tabelle). Gibt es einen zentralen Ort, den wir überprüfen können?

Greg
quelle

Antworten:

3

Zuerst müssen Sie CDC auf Datenbankebene aktivieren.

USE database_name
GO 
EXEC sys.sp_cdc_enable_db 
GO 

Dann müssen Sie CDC auf Tabellenebene aktivieren

USE database_name
GO 
EXEC sys.sp_cdc_enable_table 
@source_schema = N'dbo', 
@source_name   = N'table1', 
@role_name     = NULL 

Die folgende Abfrage zeigt Ihnen, für welche Tabellen cdc aktiviert ist

SELECT [name], is_tracked_by_cdc  
FROM sys.tables 

aktualisieren:

Was ich versuche zu finden, ist für eine gegebene Lsn, welche CDC-Tabellen einen Datensatz haben

Ich denke, das ist nicht relevant, wie wenn Sie eine CDC aktivieren

__ $ start_lsn

__ $ end_lsn

__ $ seqval

__ $ Operation

__ $ update_mask

Das __$start_lsnund __$end_lsnentspricht der Tabelle selbst, für die Sie CDC ON aktiviert haben.

Ich sehe keine Notwendigkeit, bei der Sie eine Tabellensuche basierend auf LSN durchführen müssen, um den Tabellennamen herauszufinden - es sei denn, ich verstehe Ihre Frage nicht.

Sie können sogar in den Systemtabellen nachschlagen

cdc.captured_columns

cdc.change_tables

cdc.ddl_history

cdc.index_columns

cdc.lsn_time_mapping => Gibt eine Zeile für jede Transaktion mit Zeilen in einer Änderungstabelle zurück. Diese Tabelle wird verwendet, um zwischen den Festschreibungswerten für die Protokollsequenznummer (LSN) und der Zeit, zu der die Transaktion festgeschrieben wurde, zuzuordnen.

dbo.systranschemas

Lesen Sie weiter: Eine Einführung in SQL Server 2008 Change Data Capture von Brad McGehee und eine Einführung in Change Data Capture (CDC) in SQL Server 2008 von Pinal Dave.

Kin Shah
quelle
Entschuldigung, ich war in der Frage wahrscheinlich nicht klar genug. Was ich versuche zu finden, ist für einen bestimmten Lsn, dessen CDC-Tabellen einen Rekord haben
Greg
@ Greg Ich habe meine Antwort aktualisiert.
Kin Shah
Ich habe der Frage weitere Informationen hinzugefügt, die sie möglicherweise etwas klarer machen. Wir versuchen, einen bestimmten Bereich von LSNs in der Datenbank zu finden, wenn wir keine Ahnung haben, wo sie sich befinden
Greg
1
Downvoters ... Bitte hinterlassen Sie einen Kommentar, warum die Antwort abgelehnt wurde.
Kin Shah
0

Wie in der Frage erwähnt, versuchen wir, mehrere cdc-Tabellen abzufragen und einen ähnlichen Prozess auf alle anzuwenden. Die einzige Möglichkeit, dies zu tun, besteht darin, jede Tabelle einzeln abzufragen (mithilfe der fn_cdc_get_all_changes_dbo_tablenameFunktion). Es gibt keinen zentralen Ort, an dem überprüft werden kann, was sich geändert hat.

Greg
quelle
1
Sie sollten nur dynamisches tsql für sys.tablesgefiltert nach verwenden is_tracked_by_cdcund die Funktion verwenden, um abzufragen, was sich geändert hat.
Kin Shah