È 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:
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:
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.