データが含まれているSQL Server 2016データベースのいくつかの既存のテーブルのシステムバージョン管理を有効にしようとしています。私はこれらのMicrosoftからの 手順 に従っています。
テーブルの1つは次のようになります。
CREATE TABLE [dbo].[ClientBeacon](
[ClientId] [int] NOT NULL,
[BeaconId] [int] NOT NULL,
[FromDate] [datetime] NOT NULL,
[ToDate] [datetime] NULL,
[Deleted] [bit] NOT NULL,
[ModifiedByUserId] [nvarchar](128) NOT NULL,
[ModifiedOn] [datetime] NOT NULL,
[Timestamp] [timestamp] NOT NULL,
CONSTRAINT [PK_ClientBeacon] PRIMARY KEY CLUSTERED
(
[ClientId] ASC,
[BeaconId] ASC
)
)
そして、実行しようとしているスクリプトは次のようになります。
CREATE SCHEMA History;
GO
ALTER TABLE dbo.ClientBeacon
ADD
SysStartTime datetime2(0) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT DF_ClientBeacon_SysStartTime DEFAULT SYSUTCDATETIME(),
SysEndTime datetime2(0) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT DF_ClientBeacon_SysEndTime DEFAULT CONVERT(datetime2 (0), '9999-12-31 23:59:59'),
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
GO
ALTER TABLE dbo.ClientBeacon SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.ClientBeacon));
GO
スクリプトを実行すると、次のエラーが発生します。
Msg 13542, Level 16, State 0, Line 4
ADD PERIOD FOR SYSTEM_TIME on table 'test.dbo.ClientBeacon' failed because there are open records with start of period set to a value in the future.
Msg 13510, Level 16, State 1, Line 11
Cannot set SYSTEM_VERSIONING to ON when SYSTEM_TIME period is not defined.
このエラーについて私が見つけることはあまりありません。 この投稿 のコメントに提案があります。UTCがサーバー時間よりも早い場合、デフォルトでUTCを使用することが問題になる可能性がありますが、英国では夏時間、1時間進んでいますUTCの。念のためGETDATE
を使用しようとしましたが、同じエラーが発生します。
同様の問題があり、alter tableを2つの個別のステートメントに分割することで解決しました。試す
ALTER TABLE dbo.ClientBeacon ADD
datetime2(0) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT F_ClientBeacon_SysStartTime DEFAULT SYSUTCDATETIME(),
SysEndTime datetime2(0) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT DF_ClientBeacon_SysEndTime DEFAULT CONVERT(datetime2 (0), '9999-12-31 23:59:59');
GO
ALTER TABLE dbo.ClientBeacon ADD
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
GO
SYSUTCDATETIME()
をDATEADD(MINUTE,-1,SYSUTCDATETIME())
に変更するだけです
これは古い投稿であることは知っていますが、同じ問題が発生しました。そして、これはうまくいきました。
CONSTRAINT DF_TableName_SysStart
DEFAULT DATEADD(SECOND,-1, SYSUTCDATETIME()) -- **WORKED**
-- other options I've tried
DEFAULT DATEADD(SECOND,0, SYSUTCDATETIME()) -- didn't work
DEFAULT SYSUTCDATETIME() -- didn't work
DEFAULT SYSDATETIME() -- didn't work
DEFAULT GETDATE() -- didn't work
DEFAULT DATEADD(MINUTE,-59, SYSDATETIME()) -- didn't work
DEFAULT DATEADD(MINUTE,-60, SYSDATETIME()) -- **WORKED**
古い投稿ですが、今日これに遭遇し、動作しました。原因はSysStartTimeの解決にあります。これを使って:
ALTER TABLE dbo.ClientBeacon
ADD
SysStartTime datetime2(7) GENERATED ALWAYS AS ROW START HIDDEN CONSTRAINT DF_ClientBeacon_SysStartTime DEFAULT SYSUTCDATETIME(),
SysEndTime datetime2(7) GENERATED ALWAYS AS ROW END HIDDEN CONSTRAINT DF_ClientBeacon_SysEndTime DEFAULT CONVERT(datetime2 (7), '9999-12-31 23:59:59.9999999'),
PERIOD FOR SYSTEM_TIME (SysStartTime, SysEndTime);
私の(準教育を受けた)推測では、SQL Serverは時間を最も近い秒に丸め、場合によっては切り上げます。それから、それは時間を見て、「おお、カウボーイ、その時間は未来にあります!」そして失敗する。