改变系统版本控制表(Temporal Table)列的最佳机制?

时间:2016-11-01 08:08:43

标签: sql-server sql-server-2016 temporal

我有一个系统版本表,其历史表相关如下:

CREATE TABLE [dbo].[ExpenseCenter_Archive](
    [ExpenseCenterId] [tinyint] NOT NULL,
    [Name] [nvarchar](200) NOT NULL,
    [LineCode] [smallint] NOT NULL,
    [SysStartTime] [datetime2](2) NOT NULL,
    [SysEndTime] [datetime2](2) NOT NULL
) ON [FG_HISTORY]
GO
-------
CREATE TABLE [dbo].[ExpenseCenter](
    [ExpenseCenterId] [tinyint] NOT NULL,
    [Name] [nvarchar](200) NOT NULL,
    [LineCode] [smallint] NOT NULL,
    [SysStartTime] [datetime2](2) GENERATED ALWAYS AS ROW START NOT NULL,
    [SysEndTime] [datetime2](2) GENERATED ALWAYS AS ROW END NOT NULL,
 CONSTRAINT [PK_ExpenseCenter] PRIMARY KEY CLUSTERED 
(
    [ExpenseCenterId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [FG_DATA],
CONSTRAINT [UK_ExpenseCenterName] UNIQUE NONCLUSTERED 
(
    [Name] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 90) ON [FG_INDEX],
    PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [FG_DATA]
WITH
(
SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[ExpenseCenter_Archive] , DATA_CONSISTENCY_CHECK = ON )
)
GO

现在,我想要改变数据类型' LineCode'在系统版本表和历史记录中。更改后再次启用它如下:

--- Before edit column
ALTER TABLE [dbo].[ExpenseCenter] SET (SYSTEM_VERSIONING = OFF);  
-- ## Edit column in ssms ##

--- After edit column
ALTER TABLE [dbo].[ExpenseCenter] 
SET    
(   
SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[ExpenseCenter_Archive])   
);   

但是我收到以下错误:

未定义SYSTEM_TIME时段时,无法将SYSTEM_VERSIONING设置为ON。

如何解决此问题。

2 个答案:

答案 0 :(得分:3)

根据您的问题,您说ExpenseCenter_archiveExpenseCenter的时间表..但错误消息显示

  

您没有系统版本化表[dbo].[ExpenseCenter],如果您需要系统版本化表,请向其添加system_time

所以这里是步骤,我会按照制作一张其他的临时表...

如果是新表..

CREATE TABLE Department   
(    
     DeptID int NOT NULL PRIMARY KEY CLUSTERED  
   , DeptName varchar(50) NOT NULL  
   , ManagerID INT  NULL  
   , ParentDeptID int NULL  
   , SysStartTime datetime2 GENERATED ALWAYS AS ROW START NOT NULL  
   , SysEndTime datetime2 GENERATED ALWAYS AS ROW END NOT NULL  
   , PERIOD FOR SYSTEM_TIME (SysStartTime,SysEndTime)     
)    
WITH (SYSTEM_VERSIONING = ON)   
;  

如果我需要更改这个新创建的表的数据类型..

MSDN recommends doing it in a transaction ..

BEGIN TRAN   
ALTER TABLE [dbo].[CompanyLocation] SET (SYSTEM_VERSIONING = OFF);  

ALTER TABLE [CompanyLocation] ADD Cntr INT IDENTITY (1,1);   

ALTER TABLE [dbo].[CompanyLocation]    
SET    
(   
SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[CompanyLocationHistory])   
);   
COMMIT ;  

如果我想创建一个现有的表Temporal,那么我会在下面做

ALTER TABLE dbo.Product
ADD StartTime DATETIME2 GENERATED ALWAYS AS ROW START
  HIDDEN DEFAULT GETUTCDATE(),
 EndTime  DATETIME2 GENERATED ALWAYS AS ROW END
  HIDDEN DEFAULT
     CONVERT(DATETIME2, '9999-12-31 23:59:59.9999999'),
 PERIOD FOR SYSTEM_TIME (StartTime, EndTime)

现在终于设置Temporal ON

ALTER TABLE dbo.Product
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE=dbo.ProductHistory))
GO

参考文献:
http://sqlhints.com/tag/modify-existing-table-as-system-versioned-temporal-table/
https://msdn.microsoft.com/en-us/library/mt590957.aspx

答案 1 :(得分:0)

对于alter system版本控制表,您不需要设置SYSTEM_VERSIONING = OFF,而是直接使用ALTER TABLE ...