Navicat 不支持可视化创建 SQL Server 时态表,因其表设计器未提供 SYSTEM_VERSIONING 和 PERIOD FOR SYSTEM_TIME 配置入口,必须手写 DDL;同步功能也忽略版本控制状态,且历史表不可编辑。

Navicat 本身不支持可视化创建 SQL Server 系统版本控制时态表(SYSTEM_VERSIONING = ON),它无法在表设计界面中勾选“启用系统版本控制”或自动补全历史表配置。你必须手动编写并执行 DDL,否则会报错或生成无效结构。
为什么 Navicat 的表设计器不能直接建时态表
Navicat for SQL Server 的图形化表设计器只映射标准 DDL 元素:字段、主键、索引、外键、默认值等。而系统版本控制依赖两个关键非可见约束:
-
PERIOD FOR SYSTEM_TIME列定义(需两列DATETIME2类型,且不能为 NULL) -
SYSTEM_VERSIONING = ON (HISTORY_TABLE = ...)表级选项,设计器根本不提供入口 - 历史表本身也需提前存在或由 SQL Server 自动创建——但 Navicat 不会帮你判断是否已存在、是否兼容、是否带正确索引
必须手写 DDL 才能成功启用 SYSTEM_VERSIONING
在 Navicat 中新建查询窗口,执行类似以下语句(注意替换实际表名和列名):
CREATE TABLE dbo.Employee
(
EmployeeID int NOT NULL PRIMARY KEY CLUSTERED,
Name nvarchar(100) NOT NULL,
Position varchar(50) NOT NULL,
ValidFrom datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
ValidTo datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
关键点:
-
GENERATED ALWAYS AS ROW START/END必须显式声明,且类型只能是datetime2 -
HISTORY_TABLE名称必须符合标识符规则;若该表不存在,SQL Server 会自动创建,但不会加索引——后续得手动在历史表上建CLUSTERED INDEX提升查询性能 - 执行前确保数据库兼容级别 ≥ 130(SQL Server 2016+),否则
SYSTEM_VERSIONING语法不识别
用 Navicat 同步结构时,SYSTEM_VERSIONING 会被忽略
即使你用 DDL 创建了正确的时态表,后续使用 Navicat 的「结构同步」功能对比两个库时:
- 它不会检测
SYSTEM_VERSIONING开关状态差异 - 不会比对历史表是否存在或结构是否一致
- 可能错误地把历史表当作普通表参与同步,导致
DROP TABLE或意外重建 - 因此,时态表的变更管理必须绕过图形同步,全程靠版本化 SQL 文件(如
002_enable_employee_versioning.sql)+ Git + 手动校验
真正容易被忽略的是:时态表的历史数据不可写,但 Navicat 的数据网格仍允许你双击历史表尝试编辑——这会直接触发 The operation is not supported on system-versioned tables. 错误,且不提示原因。操作前务必确认当前打开的是主表,而非自动生成的 xxxHistory 表。


















