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.
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
Il suffit de changer SYSUTCDATETIME()
à DATEADD(MINUTE,-1,SYSUTCDATETIME())
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**
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.