所以我不能在时态表的列定义中使用NOT NULL?

时间:2017-08-10 20:05:34

标签: sql sql-server temporal

我正在使用SQL Server 2016并尝试创建Temporal表。这是定义:

USE zbachoreTest
GO`enter code here`
IF EXISTS (SELECT 1 FROM sys.tables WHERE name = 'People' AND temporal_type_desc ='SYSTEM_VERSIONED_TEMPORAL_TABLE' )
ALTER TABLE dbo.People SET( SYSTEM_VERSIONING = OFF)
DROP TABLE IF EXISTS dbo.People 
CREATE TABLE dbo.People(
    PersonID INT IDENTITY(1,1) NOT NULL CONSTRAINT PK_People PRIMARY KEY(PersonID),
    FirstName VARCHAR(50) NOT  NULL,
    LastName VARCHAR(50)  NULL,
    StartTime DATETIME2 GENERATED ALWAYS AS ROW START NOT NULL
        CONSTRAINT DF_People_StartTime DEFAULT SYSDATETIME(),
    EndTime DATETIME2 GENERATED ALWAYS AS ROW END NOT NULL
        CONSTRAINT DF_People_EndTime DEFAULT CONVERT(DATETIME2,'9999-12-31 23:59:59.9999999'),
    PERIOD FOR SYSTEM_TIME(StartTime,EndTime)
    ) WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.PeopleHistory))

当我运行上面的代码时,我收到以下错误消息: Msg 13531,Level 16,State 1,Line 7 将SYSTEM_VERSIONING设置为ON失败,因为列'FirstName'在表'zbachoreTest.dbo.People'和'zbachoreTest.dbo.PeopleHistory'中没有相同的nullability属性。

任何聪明的人都请帮忙。谢谢!

1 个答案:

答案 0 :(得分:1)

是的,你可以。

首先supportFragmentManager.transactStateless { replace(containerViewId, fragmentInstance, "TAG") } 。如果它已经存在,它将仅被验证,而不是重新创建。

来自:https://docs.microsoft.com/en-us/sql/relational-databases/tables/creating-a-system-versioned-temporal-table

  

历史记录表必须始终与当前或者模式对齐   时间表,按列数,列名,排序   和数据类型。

  

如果HISTORY_TABLE参数指定的表已存在,   它将根据新创建的时态表进行验证   模式一致性和时间数据一致性。如果你指定一个   无效的历史表,CREATE TABLE语句将失败。