为什么我有多个(未关联的)时间历史表?


8

我一直在建立具有SQL Server 2017后端的概念证明系统。
系统使用临时表记录资产配置并跟踪随时间的变化。
我有一个链接到历史记录表的数据表,我们称它为dbo.MSSQL_TemporaryHistoryFor_12345678900。

到目前为止,一切都很好。我有两个问题:

今天,我关闭了表的版本控制功能,因此可以添加一个计算列。完成此操作,然后再次打开,没有错误。

现在,我发现我无法查询更改之前的任何历史数据。新数据将添加到历史记录中,但是没有任何预先设置。

在SSMS内部,我现在可以看到有多个历史记录表,它们都具有相同的名称,但带有十六进制后缀,例如dbo.MSSQL_TemporaryHistoryFor_12345678900_A0B1C2D3。它们未链接在主数据表下方。它们只是在数据库内部自行浮动。当我查询sys.tables时,这些没有显示为历史表,也没有链接到主数据表。

这些表确实包含丢失的历史数据。

因此,我的问题是:

  • 这些附加表代表什么?
  • 他们是如何创建的?
  • 有什么办法可以将它们重新链接到主要历史链中,以便我可以获取历史报告吗?

这非常令人沮丧,因此将非常感谢您能提供的任何帮助。谢谢。


1
如果您提供进入此状态之前运行的命令,则可能会有所帮助。
LowlyDBA

Answers:


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 docs在“ 系统版本的临时表停止系统版本”页面上专门对此进行了说明:

重新打开系统版本控制时,不要忘记指定HISTORY_TABLE参数。否则,将导致创建新的历史记录表并将其与当前表关联。原始历史记录表仍将作为普通表存在,但不会与当前表关联。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.