Microsoft 文档当前在 ALTER TABLE 系统版本控制示例中给出了如何在现有表上启用临时表的示例:A. 将系统版本控制添加到现有表
使用那里的语法但指定一个常量默认值,我有:
ALTER TABLE InsurancePolicy
ADD PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo),
ValidFrom datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL
-- DEFAULT SYSUTCDATETIME(), /* default specified in the docs */
DEFAULT CONVERT(DATETIME2, '2023-08-14') /* use a constant default */
ValidTo datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL
DEFAULT CONVERT(DATETIME2, '9999-12-31 23:59:59.99999999') ;
当我运行此语句时,我可以SP:StatementStarting
使用 TextData 观察一个事件:SELECT [ValidFrom],[ValidTo] FROM [dbo].[InsurancePolicy]
这告诉我 SQL Server 正在查看该数据(可能是为了确定 ValidTo 和 ValidFrom 符合某些约束)。
模式修改锁+表扫描让我感到悲伤。
理论上,扫描是不必要的,因为这些值是恒定的。在 Microsoft 的文档中,示例 B,他们提到“(在后台进行一组特定的数据检查)”但当列是全新的时,这些检查也许是不必要的。所以:
有什么办法可以在线启用时态表吗?扫描表时不在表上放置 sch-m 锁?
不会。检查是在
PERIOD FOR SYSTEM_TIME
添加时执行的,它们无法避免,并且架构更改是在Sch-M
锁定下执行的。您必须手动逐步迁移到新表或实施您自己的历史记录跟踪解决方案。
内置的时态表功能看起来简单方便,但它缺乏控制和灵活性,并且根据您的预期用途,还会出现一些不良行为。