使用触发器

触发器是一系列当在表中的数据修改时要执行的SQL语句的集合。你可以创建一些当在表中的数据在插入，修改或删除时触发的触发器。在本节中，你将学习如何创建和使用触发器。

使用命令

CREATE TRIGGER来创建触发器

你可以使用语句CREATE TRIGGER来创建一个触发器。与存储过程不同，每个触发器都必须和某一个特定的表相关，而且每一个触发器都只和作用于该表上的一个或多个动作有关，下面就是CREATE TRIGGER语句的一个简单例子：

CREATE TRIGGER tr_webusers_insert ON webusers FOR INSERT AS

EXECUTE master..xp_sendmail

“administrator” “New user registered!”

该触发器的名称为tr_webusers_insert。你可以使用任何你想用的名称来命名触发器，但是每个触发器都必须有唯一的名称。在触发器的名称内包含和触发器相关联的表和动作作为触发器名称的一部分是一个很好的主意。

在CREATE TRIGGER语句中等ON短语用于指明和触发器相关联的数据表。本例子中的触发器和表webusers相关联，它会在该表中的数据变动时触发。

FOR短语指明会触发该触发器的动作。在本例子中，触发器会在有任何新的数据添加入该表时被触发。同样的，你可以创建一个在表内的数据进行更新或删除时触发的触发器，你只需要使用关键词UPDATE或DELETE。

在AS短语后面，你可以列出一个或多个SQL短语。在本例子中，触发器仅包含一个单独的语句。当有新的记录添加到表webusers中时，管理员会自动发送Email信息，New User registered!

对于触发器，请牢记以下重要几点：

> 触发器和某一指定的表格有关，当该表格备删除时，任何与该表有关的触发器同样会被删除。比如，当表格webusers被删除时，触发器tr_webusers_insert也同样会被删除。

> 在一个表上的每一个动作只能有一个触发器与之关联。例如：你不能在表webusers上创建第二个触发器，该触发器在有数据插入表中时触发。

> 在一个单独的表上，你最多只能创建三个触发器与之关联，一个INSERT触发器，一个DELETE触发器和一个UPDATE触发器。

> 当你添加第二个由相同动作触发的触发器时，第一个触发器会在没有任何警告信息的条件下被删除。这是件非常令人烦恼的事情。所以必须仔细地记录你的触发器信息，以防止该类事情的发生。

注意

要观看所有在当前数据库中的触发器列表。你可以使用系统存储过程sp_help。假如你不加任何修改地执行sp_help，该过程将会显示在当前的数据库中所有的过程，触发器及表。假如在触发器后面跟上一个指定的触发器名称（比如 sp_help tr_webusers_insert），sp_help将会只显示和该触发器有关的信息。

你可以让一个触发器和一个单独的表中多于一个的动作关联。比如你可以修改上面例子中的触发器，使其在表中的数据在添加或更新时触发。下面就是你修改后的结果：

CREATE TRIGGER tr_webusers ON webusers FOR INSERT,DELETE AS

EXECUTE master..xp_sendmail

“administrator” “User registered or modified!”

在你创建了触发器后，你可以使用系统存储过程sp_helptext来观看包含在触发器中的语句。该过程显示触发器的文本。例如：命令 sp_helptext tr_webusers会显示下面的结果：

text

………………………………………

..

CREATE TRIGGER tr_webusers ON webusers FOR INSERT,DELETE AS

EXECUTE master..xp_sendmail

“administrator” “User registered or modified!”

触发器只有在其FOR短语后面指定的动作发生时执行。你不能直接执行一个触发器。你不能直接执行一个触发器。比如说假如你尝试执行tr_webusers时，你会得到如下的错误信息：

The request for procedure

‘tr_webusers’ failed because ‘tr_webusers’ is a trigger object

有三种方法可以破坏一个触发器，你可以使用命令DROP TRIGGER后面跟触发器的名称来显式地删除一个触发器。比如，下面的语句删除触发器tr_webusers。

DROP TRIGGER tr_webusers

当数据表被删除时，与之相关的触发器会自动地被删除了。例如，当表webusers被删除时，触发器tr_webusers会自动被删除掉。

最后，当一个新的在同一个表中与同一动作相关联的触发器创建时，旧的触发器会被自动删除。例如，当触发器tr_webusers创建时，触发器tr_erbusers_insert会自动地被删除掉。这是因为两个触发器都由同一个数据表的INSERT动作触发。

注意

如果触发器tr_webusers在触发器tr_webusers_insert之前创建。触发器tr_webusers只会被部分删除，这是因为触发器tr_webusers由INSERT和UPDATE触发。触发器将在有数据更新时继续触发。然而触发器将不会在有数据添加时触发。新的触发器tr_webusers_insert会取代该任务。