Похоже, что существует несоответствие между SQL Обработка сервером значений по умолчанию для столбца GENERATED ALWAYS AS ROW и обычных значений столбца при использовании транзакции.
Рассмотрим приведенный ниже скрипт. При применении транзакции значение столбца SysStartTime всегда устанавливается на время в начале транзакции, а значение CreatedOn устанавливается на текущее время в этой строке выполнения в транзакции.
Мы хотели привить соглашение, согласно которому, когда значение столбца CreatedOn равно значению столбца SysStartTime, в таблице истории нельзя ожидать никаких записей. Это, конечно, делает этот план немного сложнее в обслуживании.
CREATE TABLE [TemporalTable] (
[Id] [uniqueidentifier] NOT NULL,
[CreatedOn] [datetime2](2) NOT NULL,
[SysStartTime] [datetime2](2) GENERATED ALWAYS AS ROW START NOT NULL,
[SysEndTime] [datetime2](2) GENERATED ALWAYS AS ROW END NOT NULL,
CONSTRAINT [PK_TemporalTable] PRIMARY KEY CLUSTERED
(
[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 100) ON [PRIMARY],
PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY]
WITH
(
SYSTEM_VERSIONING = ON ( HISTORY_TABLE = [dbo].[TemporalTableHistory] )
)
ALTER TABLE [dbo].[TemporalTable] ADD CONSTRAINT [DF_TemporalTable_Id] DEFAULT (newid()) FOR [Id]
ALTER TABLE [dbo].[TemporalTable] ADD CONSTRAINT [DF_TemporalTable_CreatedOn] DEFAULT (sysutcdatetime()) FOR [CreatedOn]
ALTER TABLE [dbo].[TemporalTable] ADD CONSTRAINT [DF_TemporalTable_SysStartTime] DEFAULT (sysutcdatetime()) FOR [SysStartTime]
ALTER TABLE [dbo].[TemporalTable] ADD CONSTRAINT [DF_TemporalTable_SysEndTime] DEFAULT (CONVERT([datetime2](2),'9999-12-31 23:59:59')) FOR [SysEndTime]
BEGIN TRAN
WAITFOR DELAY '00:00:10'
INSERT INTO [dbo].[TemporalTable]
([Id])
VALUES
(NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID())
WAITFOR DELAY '00:00:10'
INSERT INTO [dbo].[TemporalTable]
([Id])
VALUES
(NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID()), (NEWID())
COMMIT TRAN
SELECT
*
FROM
[dbo].[TemporalTable]
ORDER BY
[CreatedOn]
ALTER TABLE [TemporalTable] SET (SYSTEM_VERSIONING = OFF)
DROP TABLE [TemporalTable]
DROP TABLE [TemporalTableHistory]
Единственное решение, которое я нашел до сих пор, - это создать переменную с SYSUTCDATETIME () в качестве значения и использовать эту переменную в качестве значения на дату создания при выполнении любых вставок внутри транзакции.
Может ли это считаться чем-то, что SQL Команда сервера должна правильно выровнять?