比较触发器与约束

约束和 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 触发器。

请参阅

概念

了解 DML 触发器
DML 触发器的类型
AdventureWorks 示例数据库中的 DML 触发器
级联引用完整性约束
CHECK 约束
数据完整性

其他资源

存储过程(数据库引擎)
强制数据完整性

帮助和信息

获取 SQL Server 2005 帮助