比较触发器与约束

约束和 DML 触发器在特殊情况下各有优点。DML 触发器的主要优点在于它们可以包含使用 Transact-SQL 代码的复杂处理逻辑。因此,DML 触发器可以支持约束的所有功能;但 DML 触发器对于给定的功能并不总是最好的方法。

实体完整性总应在最低级别上通过索引进行强制,这些索引应是 PRIMARY KEY 和 UNIQUE 约束的一部分,或者是独立于约束而创建的。域完整性应通过 CHECK 约束进行强制,而引用完整性 (RI) 则应通过 FOREIGN KEY 约束进行强制,假设这些约束的功能满足应用程序的功能需求。

当约束支持的功能无法满足应用程序的功能要求时,DML 触发器非常有用。例如:

  • 除非 REFERENCES 子句定义了级联引用操作,否则 FOREIGN KEY 约束只能用与另一列中的值完全匹配的值来验证列值。

  • 约束只能通过标准化的系统错误消息来传递错误消息。如果应用程序需要(或能受益于)使用自定义消息和较为复杂的错误处理,则必须使用触发器。

DML 触发器可以将更改通过级联方式传播给数据库中的相关表;不过,通过级联引用完整性约束可以更有效地执行这些更改。

  • DML 触发器可以禁止或回滚违反引用完整性的更改,从而取消所尝试的数据修改。当更改外键且新值与其主键不匹配时,这样的触发器将生效。但是,FOREIGN KEY 约束通常用于此目的。

  • 如果触发器表上存在约束,则在 INSTEAD OF 触发器执行后但在 AFTER 触发器执行前检查这些约束。如果违反了约束,则回滚 INSTEAD OF 触发器操作并且不执行 AFTER 触发器。