Расхождение между сгенерированным всегда по умолчанию и столбцом по умолчанию в транзакции - PullRequest
0 голосов
/ 06 февраля 2020

Похоже, что существует несоответствие между 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 Команда сервера должна правильно выровнять?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...