Share via


Migrieren von Daten aus regulären Tabellen zu Ledgertabellen

Gilt für: SQL Server 2022 (16.x) Azure SQL-DatenbankAzure SQL Managed Instance

Es ist nicht möglich, reguläre Tabellen in Ledgertabellen zu konvertieren, aber Sie können die Daten aus einer vorhandenen regulären Tabelle zu einer Ledgertabelle migrieren und dann die ursprüngliche Tabelle durch die Ledgertabelle ersetzen.

Wenn Sie eine Datenbankledgerprüfung durchführen, muss der Prozess alle Vorgänge innerhalb jeder Transaktion ordnen. Wenn Sie mit einer SELECT INTO- oder BULK INSERT-Anweisung ein paar Milliarden Zeilen aus einer regulären Tabelle in eine Ledgertabelle kopieren, wird dies in einer einzigen Transaktion erledigt. Dies bedeutet, dass viele Daten vollständig sortiert werden müssen, was in einem einzelnen Thread ausgeführt wird. Der Sortiervorgang dauert lange, bis der Vorgang abgeschlossen ist.

Zum Konvertieren einer regulären Tabelle in eine Ledgertabelle empfiehlt Microsoft die Verwendung der gespeicherten Prozedur sys.sp_copy_data_in_batches. Dadurch wird der Kopiervorgang in Batches von 10-100 K-Zeilen pro Transaktion aufgeteilt. Daher verfügt die Datenbankbuchüberprüfung über kleinere Transaktionen, die parallel sortiert werden können. Dies verkürzt die Dauer der Datenbankledgerprüfung erheblich.

Hinweis

Der Kunde kann weiterhin andere Befehle, Dienste oder Tools verwenden, um die Daten aus der Quelltabelle in die Zieltabelle zu kopieren. Achten Sie darauf, große Transaktionen zu vermeiden, da dies Auswirkungen auf die Datenbankledgerprüfung hat.

In diesem Artikel erfahren Sie, wie Sie eine reguläre Tabelle in eine Ledgertabelle konvertieren können.

Voraussetzungen

Erstellen einer nur Anfügevorgänge unterstützenden oder aktualisierbaren Ledgertabelle

Bevor Sie die gespeicherte Prozedur sys.sp_copy_data_in_batches verwenden können, müssen Sie eine nur Anfügevorgänge unterstützende oder aktualisierbare Ledgertabelle mit demselben Schema wie die Quelltabelle erstellen. Das Schema sollte in Bezug auf die Anzahl der Spalten, Spaltennamen und deren Datentypen identisch sein. TRANSACTION ID, SEQUENCE NUMBER und GENERATED ALWAYS-Spalten werden ignoriert, da sie vom System generiert werden. Indizes zwischen den Tabellen können unterschiedlich sein, aber die Zieltabelle kann nur eine Heaptabelle sein oder einen gruppierten Index haben. Nicht gruppierte Indizes sollten danach erstellt werden.

Angenommen, die Datenbank enthält die folgende reguläre Employees-Tabelle.

CREATE TABLE [dbo].[Employees](
	[EmployeeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
	[SSN] [char](11) NOT NULL,
	[FirstName] [nvarchar](50) NOT NULL,
	[LastName] [nvarchar](50) NOT NULL,
	[Salary] [money] NOT NULL
	);

Die einfachste Möglichkeit, eine nur Anfügevorgänge unterstützende oder aktualisierbare Ledgertabelle zu erstellen wäre, ein Skript der ursprünglichen Tabelle zu erstellen und die LEDGER = ON-Klausel hinzuzufügen. Im folgenden Skript erstellen wir eine neue aktualisierbare Ledgertabelle mit Namen Employees_LedgerTable basierend auf dem Schema der Employees-Tabelle.

	CREATE TABLE [dbo].[Employees_LedgerTable](
	[EmployeeID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED,
	[SSN] [char](11) NOT NULL,
	[FirstName] [nvarchar](50) NOT NULL,
	[LastName] [nvarchar](50) NOT NULL,
	[Salary] [money] NOT NULL
	)
    WITH 
    (
      SYSTEM_VERSIONING = ON,
      LEDGER = ON
    ); 

Kopieren von Daten aus einer regulären Tabelle in eine Ledgertabelle

Die gespeicherte Prozedur sys.sp_copy_data_in_batches kopiert nach der Überprüfung, ob die Schemata identisch sind, Daten aus der Quelltabelle in die Zieltabelle. Die Daten werden in Batches in einzelnen Transaktionen kopiert. Wenn der Vorgang fehlschlägt, wird die Zieltabelle teilweise aufgefüllt. Die Zieltabelle sollte auch leer sein.

Im folgenden Skript kopieren wir die Daten aus der regulären Employees-Tabelle in die neue aktualisierbare Ledgertabelle Employees_LedgerTable.

sp_copy_data_in_batches @source_table_name = N'Employees' , @target_table_name = N'Employees_LedgerTable'