web-dev-qa-db-fra.com

Erreur 13542 Activation de la version système pour les tables existantes

J'essaie d'activer la version système pour certaines tables existantes dans une base de données SQL Server 2016, contenant des données. Je suive ces instructions de Microsoft.

Une des tables ressemble à ceci:

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
    )
)

Et le script que j'essaie de courir ressemble à ceci:

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

Le résultat de l'exécution du script est l'erreur suivante:

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.

Il n'y a pas grand chose que je peux trouver sur cette erreur. Il y a une suggestion dans un commentaire sur ce post que l'utilisation de UTC dans la valeur par défaut peut être un problème si l'UTC est en avance sur le temps du serveur, mais je suis au Royaume-Uni le temps d'épargne au jour, une heure à venir. de UTC. J'ai essayé d'utiliser GETDATE juste au cas où, mais la même erreur se produit.

6
Jonathan Sayce

J'ai eu un problème similaire et la division de la table d'alter en deux déclarations distinctes résolues. Essayer

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

Il suffit de changer SYSUTCDATETIME() à DATEADD(MINUTE,-1,SYSUTCDATETIME())

2
Phan Hoàng Nhân

Je sais que c'est plus vieux post, mais je viens d'avoir un même problème. Et celui-ci a travaillé.

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

Ancien post, mais je l'ai couru aujourd'hui et je l'ai eu du travail. Le coupable est dans la résolution de SysStarttime. Utilisez ceci:

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);   

Mon service (semi-éduqué) serait que SQL Server arrondit l'heure à la seconde la plus proche et parfois elle l'arrête. Ensuite, il regarde l'heure et va "whoa, cow-boy, ce temps est à l'avenir!" et échoue.

0
Thinkhoop