您需要提供历史记录表的名称,以便在打开和关闭系统版本控制时保持数据连续性。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参数。否则,将导致创建新的历史记录表并将其与当前表关联。原始历史记录表仍将作为普通表存在,但不会与当前表关联。