实现 DML 触发器

创建 DML 触发器前应考虑下列问题:

  • CREATE TRIGGER 语句必须是批处理中的第一个语句,该语句后面的所有其他语句被解释为 CREATE TRIGGER 语句定义的一部分。
  • 创建 DML 触发器的权限默认分配给表的所有者,且不能将该权限转给其他用户。
  • DML 触发器为数据库对象,其名称必须遵循标识符的命名规则。
  • 虽然 DML 触发器可以引用当前数据库以外的对象,但只能在当前数据库中创建 DML 触发器。
  • 虽然 DML 触发器可以引用临时表,但不能对临时表或系统表创建 DML 触发器。不应引用系统表,而应使用信息架构视图
  • 对于含有用 DELETE 或 UPDATE 操作定义的外键的表,不能定义 INSTEAD OF DELETE 和 INSTEAD OF UPDATE 触发器。
  • 虽然 TRUNCATE TABLE 语句类似于不带 WHERE 子句的 DELETE 语句(用于删除所有行),但它并不会触发 DELETE 触发器,因为 TRUNCATE TABLE 语句没有记录。
  • WRITETEXT 语句不会触发 INSERT 或 UPDATE 触发器。
ms187834.note(zh-cn,SQL.90).gif重要提示:
未来版本的 SQL Server 中会删除从触发器返回结果集的功能。返回结果集的触发器可能会引起应用程序出现并非计划中与它们协同工作的意外行为。请避免在新的开发工作中从触发器返回结果集,并考虑修改目前具有此行为的应用程序。若要在 SQL Server 2005 中防止从触发器返回结果集,请将disallow results from triggers 选项设置为 1。在未来版本的 SQL Server 中,此选项的默认设置将为 1。

创建 DML 触发器时需指定:

  • 名称。
  • 定义触发器时所基于的表。
  • 触发器被触发的时间。
  • 激活触发器的数据修改语句。有效选项为 INSERT、UPDATE 或 DELETE。多个数据修改语句可激活同一个触发器。例如,触发器可由 INSERT 或 UPDATE 语句激活。
  • 执行触发器操作的编程语句。

多个 DML 触发器

一个表中可以具有多个给定类型的 AFTER 触发器,只要它们的名称不相同;每个触发器可以执行多个函数。但是,每个触发器只能应用于一个表,尽管一个触发器可以应用于三个用户操作(UPDATE、INSERT 和 DELETE)的任何子集。

一个表只能具有一个给定类型的 INSTEAD OF 触发器。

触发器权限和所有权

触发器是在定义触发器时所处表或视图的架构中创建的。例如,如果在表 HumanResources.Employee 中创建触发器 Trigger1,则该触发器的架构限定名称为 HumanResources.Trigger1

CREATE TRIGGER 权限默认授予定义触发器的表所有者、sysadmin 固定服务器角色以及 db_ownerdb_ddladmin 固定数据库角色的成员,并且不可转让。

如果对某个视图创建 INSTEAD OF 触发器,如果视图所有者不同时拥有视图和触发器所引用的基表,所有权链将断开。对于不属于视图所有者的基表,表所有者必须将必要的权限单独授予读取或更新该视图的任何人。如果相同用户同时拥有视图和基础基表,他们必须只为其他用户授予视图的权限,而非个别基表的权限。有关详细信息,请参阅所有权链

创建触发器