J'ai mis en place une preuve de système concept qui a une arrière-arrière SQL Server 2017.
[.____] Le système utilise des tables temporelles pour enregistrer les configurations d'actifs et suivre les changements dans le temps.
[.____] J'ai une table de données liée à la table d'histoire, appelons-le dbo.mssql_tempporaryhistoryfor_12345678900.
Jusqu'ici tout va bien. J'ai deux problèmes:
Aujourd'hui, j'ai désactivé la version de la table sur la table afin que je puisse ajouter une colonne calculée. Cela a été fait et remis à nouveau sans erreurs.
Maintenant, je constate que je ne peux pas interroger les données historiques d'avant le changement. Les nouvelles données sont ajoutées à l'historique, mais il n'y a rien d'auparavant.
En regardant à l'intérieur des SSMS, je peux maintenant voir qu'il y a plusieurs tables d'histoire, toutes avec le même nom mais avec un suffixe hexagonal, par exemple. dbo.msql_tempporaryhistoryfor_12345678900_A0B1C2D3. Ils ne sont pas liés sous la table de données principale. Ils sont simplement flottants autour de leur propre dans la base de données. Lorsque j'ai interrogé Sys.Tables, ceux-ci ne sont pas affichés sous forme de tables d'histoire et ne sont pas liés à la table de données principale.
Ces tables contiennent les données historiques qui manquent.
Les questions que j'ai sont donc:
C'est très frustrant pour que toute aide que vous puissiez fournir serait reçue avec gratitude. Merci.
Vous Besoin Pour fournir le nom de la table d'historique afin de maintenir la continuité des données lors de la mise hors tension de la version et de l'opération. Ce comportement est mentionné dans la documentation pour Alter Table :
Si vous n'utilisez pas l'argument Historique_Table, le système génère une nouvelle table d'historique correspondant au schéma de la table actuelle, crée un lien entre les deux tables et permet au système d'enregistrer l'historique de chaque enregistrement dans la table actuelle du tableau. Table de l'histoire.
Voici une démo. Je vais créer l'exemple de table de la documentation:
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);
Il en résulte une table d'histoire nommée MSSQL_TemporalHistoryFor_1253579504
. Maintenant, je vais désactiver et activer la version système:
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON);
Et je suis dans votre situation exacte:
Maintenant, je vais tout nettoyer:
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;
Créez ensuite la table avec un nom de table d'historique spécifique:
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));
Ensuite, tournez la version du système, mais continuez à spécifier le nom de la table d'historique:
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = OFF);
ALTER TABLE dbo.Employee SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
Remarque: Dans votre situation spécifique, vous devriez pouvoir utiliser cette syntaxe sur "Rattach" une table d'historique perdu à votre table de base
Pas de tables supplémentaires:
The Takeaway
TOUJOURS Spécifiez un nom de table d'historique explicitement lors de la création de tables temporelles ou d'activation de la version système.
Les Documents MS appellent désormais cela spécifiquement sur la page Stopping System-Versioning sur une table temporelle vers la version système Page:
Lorsque vous tournez vers le système, n'oubliez pas de spécifier l'argument historique_table. Ne pas le faire, une nouvelle table d'histoire sera créée et associée à la table actuelle. La table d'histoire d'origine existera toujours comme une table normale, mais ne sera pas associée à la table actuelle.