web-dev-qa-db-ja.com

エラー13542既存のテーブルのシステムバージョン管理を有効にする

データが含まれている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を使用しようとしましたが、同じエラーが発生します。

6
Jonathan Sayce

同様の問題があり、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
5
veeroo

SYSUTCDATETIME()DATEADD(MINUTE,-1,SYSUTCDATETIME())に変更するだけです

2

これは古い投稿であることは知っていますが、同じ問題が発生しました。そして、これはうまくいきました。

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**
1
Zikato

古い投稿ですが、今日これに遭遇し、動作しました。原因は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は時間を最も近い秒に丸め、場合によっては切り上げます。それから、それは時間を見て、「おお、カウボーイ、その時間は未来にあります!」そして失敗する。

0
Thinkhoop