2016-11-01 6 views
2

У меня есть системы контроля версий таблицы с историей связанной таблицы следующим образом:Лучший механизм для изменения столбцов таблиц системного управления версиями (Temporal Table)?

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_VERSIONING в положение ON, когда период SYSTEM_TIME не определен.

Как решить эту проблему.

+0

Не ошибитесь! У меня нет ошибок в таблице alter. это происходит после редактирования или добавления столбца, и когда я хочу вернуть system_versioning в предыдущее состояние (установите его на «ON»), эта ошибка возникает. –

+0

Я сделал это, удалив поля _ [SysStartTime] _ и ​​_ [SysEndTime] _. Так кажется, это не так. –

+0

Изменения в типе таблиц не нужны для отключения/включения системного_версии. –

ответ

0

для альтер таблицы системы управления версиями не нужно устанавливать SYSTEM_VERSIONING = OFF, а непосредственно использовать ALTER TABLE ...

2

Из вашего вопроса, вы говорите, что ExpenseCenter_archive является временной таблицей для ExpenseCenter ..о сообщения об ошибке говорит

you don't have system versioned table [dbo].[ExpenseCenter] ,if you want system versioned table ,Add system_time to it

так вот шаги, я бы следовать, чтобы сделать таблицу Temporal таблицы другим. .

, если его за новый стол ..

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

Не ошибитесь! У меня нет ошибок в таблице alter. это происходит после редактирования или добавления столбца, и когда я хочу вернуть system_versioning в предыдущее состояние (установите его на «ON»), эта ошибка возникает. Спасибо –