Perché ho più tabelle di storia temporale (non associate)?


8

Ho creato un sistema di prova del concetto che ha un back-end di SQL Server 2017.
Il sistema utilizza tabelle temporali per registrare le configurazioni degli asset e tenere traccia delle modifiche nel tempo.
Ho una tabella di dati che è collegata alla tabella di cronologia, chiamiamola dbo.MSSQL_TemporaryHistoryFor_12345678900.

Fin qui tutto bene. Ho due problemi:

Oggi ho disattivato il controllo delle versioni sulla tabella in modo da poter aggiungere una colonna calcolata. Questo è stato fatto e riacceso senza errori.

Ora trovo che non posso eseguire query sui dati storici prima della modifica. Nuovi dati vengono aggiunti alla cronologia, ma non c'è nulla in anticipo.

Guardando all'interno di SSMS, ora posso vedere che ci sono più tabelle cronologiche, tutte con lo stesso nome ma con un suffisso esadecimale, ad esempio dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3. Non sono collegati sotto la tabella dei dati principale. Stanno semplicemente fluttuando da soli all'interno del database. Quando ho interrogato sys.tables, questi non sono mostrati come tabelle cronologiche e non sono collegati alla tabella dati principale.

Queste tabelle contengono i dati storici mancanti.

Le domande che ho sono quindi:

  • Cosa rappresentano queste tabelle aggiuntive?
  • Come sono stati creati?
  • Esiste un modo per ricollegarli in qualche modo nella catena storica principale in modo da poter recuperare i miei rapporti storici?

È molto frustrante, quindi qualsiasi aiuto tu possa fornire sarebbe ricevuto con gratitudine. Grazie.


1
Potrebbe essere utile se fornisci i comandi che hai eseguito prima di entrare in questo stato.
LowlyDBA

Risposte:


8

È necessario fornire il nome della tabella della cronologia per mantenere la continuità dei dati quando si attiva e disattiva il controllo delle versioni del sistema. Questo comportamento è menzionato nella documentazione di ALTER TABLE :

Se non si utilizza l'argomento HISTORY_TABLE, il sistema genera una nuova tabella cronologica corrispondente allo schema della tabella corrente, crea un collegamento tra le due tabelle e consente al sistema di registrare la cronologia di ciascun record nella tabella corrente nella tabella di storia.

Ecco una demo. Creerò la tabella di esempio dalla documentazione:

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);

Ciò si traduce in una tabella di cronologia denominata MSSQL_TemporalHistoryFor_1253579504. Ora disabiliterò e abiliterò il controllo delle versioni del sistema:

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

E sono nella tua situazione esatta:

inserisci qui la descrizione dell'immagine


Ora pulirò tutto:

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;

Quindi creare la tabella con un nome tabella cronologico specifico:

 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));  

Quindi disattiva e attiva il controllo delle versioni del sistema, ma continua a specificare il nome della tabella cronologica:

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

Nota: nella tua situazione specifica, dovresti essere in grado di utilizzare questa sintassi per "ricollegare" una tabella della cronologia persa alla tabella di base

Nessun tavolo extra:

inserisci qui la descrizione dell'immagine

L'asporto

Specificare sempre esplicitamente un nome di tabella cronologica quando si creano tabelle temporali o si abilita il controllo delle versioni del sistema.

I documenti MS ora lo chiamano specificamente sulla pagina Stopping Versioning di sistema in una tabella temporale con versione di sistema :

Quando si riattiva il controllo delle versioni del sistema, non dimenticare di specificare l'argomento HISTORY_TABLE. In caso contrario, si creerà una nuova tabella della cronologia che verrà creata e associata alla tabella corrente. La tabella di cronologia originale esisterà comunque come una tabella normale, ma non verrà associata alla tabella corrente.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.