Почему у меня есть несколько (не связанных) временных таблиц истории?

8

Я настраивал систему проверки концепции, которая имеет серверную часть SQL Server 2017.
Система использует временные таблицы для записи конфигурации активов и отслеживания изменений во времени.
У меня есть таблица данных, которая связана с таблицей истории, назовем ее dbo.MSSQL_TevenHistoryFor_12345678900.

Все идет нормально. У меня есть две проблемы:

Сегодня я отключил контроль версий в таблице, чтобы добавить вычисляемый столбец. Это было сделано и снова включено без ошибок.

Теперь я обнаружил, что не могу запросить какие-либо исторические данные до изменения. Новые данные добавляются в историю, но заранее ничего нет.

Заглянув внутрь SSMS, я теперь вижу несколько таблиц истории, все с одним и тем же именем, но с шестнадцатеричным суффиксом, например, dbo.MSSQL_TeilitaryHistoryFor_12345678900_A0B1C2D3. Они не связаны под основной таблицей данных. Они просто плавают в базе данных самостоятельно. Когда я запрашивал sys.tables, они не отображаются в виде таблиц истории и не связаны с основной таблицей данных.

Эти таблицы содержат исторические данные, которые отсутствуют.

Поэтому у меня есть следующие вопросы:

  • Что представляют собой эти дополнительные таблицы?
  • Как они были созданы?
  • Есть ли способ каким-то образом связать их с главной цепью истории, чтобы я мог вернуть свои исторические отчеты?

Это очень неприятно, поэтому любая помощь, которую вы можете оказать, будет с благодарностью получена. Спасибо.

СМО
источник
1
Это может быть полезно, если вы предоставите команды, которые вы выполняли до того, как попали в это состояние.
LowlyDBA

Ответы:

8

Вам необходимо указать имя таблицы истории, чтобы обеспечить непрерывность данных при выключении и включении версий системы. Это поведение упоминается в документации для ALTER TABLE :

Если вы не используете аргумент HISTORY_TABLE, система генерирует новую таблицу истории, соответствующую схеме текущей таблицы, создает связь между двумя таблицами и позволяет системе записывать историю каждой записи в текущей таблице в таблица истории.

Вот демо. Я создам таблицу примеров из документации:

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

Это приводит к таблице истории с именем MSSQL_TemporalHistoryFor_1253579504. Теперь я отключу и включу управление версиями системы:

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

И я в вашей точной ситуации

введите описание изображения здесь


Теперь я все уберу

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;

Затем создайте таблицу с конкретным именем таблицы истории:

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

Затем выключите и включите управление версиями системы, но продолжайте указывать имя таблицы истории:

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

Примечание: в вашей конкретной ситуации вы сможете использовать этот синтаксис для «повторного присоединения» одной таблицы потерянной истории к вашей базовой таблице.

Никаких дополнительных таблиц:

введите описание изображения здесь

Еда на вынос

Всегда указывайте имя таблицы истории явно при создании временных таблиц или включении системного управления версиями.

Документы MS теперь обращаются к этому конкретно на странице « Остановка системного контроля версий на странице темпоральной таблицы с системным контролем версий» :

При повторном включении системного управления версиями не забудьте указать аргумент HISTORY_TABLE. В противном случае будет создана новая таблица истории, которая будет связана с текущей таблицей. Исходная таблица истории все еще будет существовать как обычная таблица, но не будет связана с текущей таблицей.

Джош Дарнелл
источник