启用的模式

在表上的 DML 操作期间,处于启用的模式的数据库对象充当约束、索引或触发器。

如果当创建约束、索引或触发器时,您未指定数据库对象模式,则缺省地启用它们。数据定义语句 CREATE TABLE、ALTER TABLE、CREATE INDEX 和 CREATE TRIGGER 都以启用的模式创建数据库对象,除非您显式地指定一种不同的模式。

在创建时刻哪种非缺省的对象模式是可用的,依赖于对象的类型:

然而,当 SET Database Object Mode 语句更改现有的约束、索引或触发器的模式时,没有缺省的模式。如果您未指定对象模式,则 SET Database Object Mode 语句失败并报警 -201。如果您想要将约束、索引或触发器的模式从某些其他模式重置为启用的,则必须显式地指定 ENABLED 关键字。

当成功地启用数据库对象时,数据库服务器在系统目录的 sysobjstate 表中注册那个对象状态,并当它的表是后续的 INSERT、DELETE、MERGE 或 UPDATE 语句(或对于 Select 触发器,SELECT 语句)的目标时会考虑那个数据库对象。因此,启动的约束是强制的,启动的索引被更新,且当触发器事件发生时,执行表上的启用的触发器。

例如,在您将外键约束和唯一索引设置为启用的模式之后,当 INSERT、DELETE、MERGE 或 UPDATE 操作尝试违反该表的引用完整性时,数据操纵操作失败,表中的行不被更改,且数据库服务器返回错误消息。

外键约束的 ENABLED NOVALIDATE 模式

在 SET Database Object Mode 语句正在将外键约束的模式更改为 ENABLED 时,数据库服务器通过检测受约束的表中的每一行验证该约束,来核实带有相应的值的行存在于被引用的表的主键列中。此验证可需要大量的时间和资源。您可在 SET Database Object 模式操作期间替代地绕过对违反行的搜索,通过包括 NOVALIDATE 关键字来将外键约束模式更改为 ENABLED NOVALIDATE。对于大型表,指定 ENABLED NOVALIDATE 可显著地减少启用外键约束所需要的时间。

在 SET Database Object Mode 语句的 SET CONSTRAINTS 选项成功地启用外键约束之后,
  • sysobjstate 系统目录表中,该约束模式成功地注册为启用的(E),
  • 在 SET CONSTRAINTS 语句运行时,NOVALIDATE 关键字已阻止了对引用完整性违反的检查,但在系统目录内无处对该关键字编码,且它对外键约束的对象模式或行为没有进一步的影响。

直到删除或禁用那个约束之前,在对它的表执行后续的 DML 操作期间,它都是强制的,以便于维护数据库的引用完整性。