Warum habe ich mehrere (nicht zugeordnete) Zeitverlaufstabellen?


8

Ich habe ein Proof-of-Concept-System eingerichtet, das über ein SQL Server 2017-Backend verfügt.
Das System verwendet Zeittabellen, um Asset-Konfigurationen aufzuzeichnen und Änderungen im Zeitverlauf zu verfolgen.
Ich habe eine Datentabelle, die mit der Verlaufstabelle verknüpft ist. Nennen wir sie dbo.MSSQL_TemporaryHistoryFor_12345678900.

So weit, ist es gut. Ich habe zwei Probleme:

Heute habe ich die Versionierung für die Tabelle deaktiviert, damit ich eine berechnete Spalte hinzufügen kann. Dies wurde durchgeführt und ohne Fehler wieder eingeschaltet.

Jetzt stelle ich fest, dass ich vor der Änderung keine historischen Daten abfragen kann. Neue Daten werden zum Verlauf hinzugefügt, aber es gibt vorher nichts.

Wenn ich in SSMS schaue, sehe ich jetzt, dass es mehrere Verlaufstabellen gibt, alle mit demselben Namen, aber mit einem Hex-Suffix, z. B. dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3. Sie sind nicht unter der Hauptdatentabelle verknüpft. Sie schweben einfach alleine in der Datenbank herum. Wenn ich sys.tables abgefragt habe, werden diese nicht als Verlaufstabellen angezeigt und sind nicht mit der Hauptdatentabelle verknüpft.

Diese Tabellen enthalten die fehlenden historischen Daten.

Die Fragen, die ich habe, sind daher:

  • Was bedeuten diese zusätzlichen Tabellen?
  • Wie wurden sie geschaffen?
  • Gibt es eine Möglichkeit, diese irgendwie wieder in die Hauptverlaufskette einzubinden, damit ich meine historischen Berichte zurückerhalten kann?

Es ist sehr frustrierend, dass jede Hilfe, die Sie leisten können, dankbar aufgenommen wird. Vielen Dank.


1
Es kann hilfreich sein, wenn Sie die Befehle angeben, die Sie ausgeführt haben, bevor Sie in diesen Zustand geraten sind.
LowlyDBA

Antworten:


8

Sie müssen den Namen der Verlaufstabelle angeben, um die Datenkontinuität beim Ein- und Ausschalten der Systemversionierung zu gewährleisten. Dieses Verhalten wird in der Dokumentation zu ALTER TABLE erwähnt :

Wenn Sie das Argument HISTORY_TABLE nicht verwenden, generiert das System eine neue Verlaufstabelle, die dem Schema der aktuellen Tabelle entspricht, erstellt eine Verknüpfung zwischen den beiden Tabellen und ermöglicht dem System, den Verlauf jedes Datensatzes in der aktuellen Tabelle in der Tabelle aufzuzeichnen Verlaufstabelle.

Hier ist eine Demo. Ich werde die Beispieltabelle aus der Dokumentation erstellen:

CREATE TABLE dbo.Employee   
(    
  [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED   
  , [Name] nvarchar(100) NOT NULL  
  , [Position] varchar(100) NOT NULL   
  , [Department] varchar(100) NOT NULL  
  , [Address] nvarchar(1024) NOT NULL  
  , [AnnualSalary] decimal (10,2) NOT NULL  
  , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START  
  , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END  
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)  
 )    
 WITH (SYSTEM_VERSIONING = ON);

Dies führt zu einer Verlaufstabelle mit dem Namen MSSQL_TemporalHistoryFor_1253579504. Jetzt werde ich die Systemversionierung deaktivieren und aktivieren:

ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON);

Und ich bin in Ihrer genauen Situation:

Geben Sie hier die Bildbeschreibung ein


Jetzt werde ich alles aufräumen:

ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
DROP TABLE dbo.Employee;
DROP TABLE dbo.MSSQL_TemporalHistoryFor_1253579504;
DROP TABLE dbo.MSSQL_TemporalHistoryFor_1253579504_D0055BB4;

Erstellen Sie dann die Tabelle mit einem bestimmten Namen der Verlaufstabelle:

 CREATE TABLE dbo.Employee   
(    
  [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED   
  , [Name] nvarchar(100) NOT NULL  
  , [Position] varchar(100) NOT NULL   
  , [Department] varchar(100) NOT NULL  
  , [Address] nvarchar(1024) NOT NULL  
  , [AnnualSalary] decimal (10,2) NOT NULL  
  , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START  
  , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END  
  , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)  
 )    
 WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));  

Schalten Sie dann die Systemversionierung aus und wieder ein, geben Sie jedoch weiterhin den Namen der Verlaufstabelle an:

ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));

Hinweis: In Ihrer speziellen Situation sollten Sie in der Lage sein, diese Syntax zu verwenden, um eine verlorene Verlaufstabelle wieder an Ihre Basistabelle anzuhängen

Keine zusätzlichen Tabellen:

Geben Sie hier die Bildbeschreibung ein

Das wegnehmen

Geben Sie beim Erstellen von Zeittabellen oder Aktivieren der Systemversionierung immer explizit einen Namen für die Verlaufstabelle an.

In den MS-Dokumenten wird dies jetzt speziell auf der Seite Stoppen der Systemversionierung auf einer systemversionierten Zeittabelle aufgerufen :

Vergessen Sie beim erneuten Aktivieren der Systemversionierung nicht, das Argument HISTORY_TABLE anzugeben. Andernfalls wird eine neue Verlaufstabelle erstellt und der aktuellen Tabelle zugeordnet. Die ursprüngliche Verlaufstabelle ist weiterhin als normale Tabelle vorhanden, wird jedoch nicht der aktuellen Tabelle zugeordnet.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.