在触发器的执行期间它可以访问两个特殊的数据表。这些表在结构上同触发器所在表是完全一样的。它们总是被称做“插入”或者“删除”表。触发器可以访问这些表来决定发生了怎样的修改操作,但是,触发器不能修改这些表。注意,对数据表各行的更新会导致插入之后的删除操作。因此,如果记录在删除和插入表中都存在,那么触发器就知道发生了更改操作。
有两个命令可以回滚触发触发器的SQL语句所实施的修改称做,这两个命令是:回滚事务和回滚触发器。
采用回滚事务(rollback trasaction)可以防止触发触发器的修改行为,从而把所有数据变化回滚到begin事务以外并放弃其余操作。这是最经常使用的方法;它保证了所有关联最外面事务的修改或者批处理都能得以回滚。
回滚触发器(Rollback Trigger)用来阻止触发触发器的修改行为。它允许其他任何事务修改或者批处理最终被提交。这种回滚方法用起来颇具技巧性,应该进行彻底的调试,原因是这样做可能造成部分修改而导致数据完整性的丧失。
我们举个例子说明以上措施:
begin tran
insert into table_a (column_a) values (“11111”)
insert into table_a (column_a) values (“22222”)
insert into table_a (column_a) values (“33333”)
commit trans
end trans
如果table_a上的插入触发器触发了回滚触发器,则其他插入不受其影响而顺序被提交。
如果table_a上的插入触发器触发回滚事务,则已经执行的插入将被回滚,余下的插入不再执行。
你可以用以下的SELECT语句生成数据库中当前定义的触发器列表:
select *
from sysobjects
where type = "TR"
你可以如下所示查看触发器的源代码:
sp_helptext <trigger_name>
只要sp_hidetext没有用于加密触发器文本而且DBA没有禁用syscomments.text列的查阅功能,那么你就应该看到用来创建指定触发器的文本内容。
假如你希望知道触发器引用的表和视图你不妨采用sp_depends存储过程。
sp_depends <trigger_name>
以下是触发器规则和限制列表。
以下是触发器不被允许的规则列表:
优秀的程序员都知道命名规范的重要性。触发器也不例外。触发器名称只能采用最多30个字符。我的习惯是采用完整的表名再加上如表A所示的后缀。
表A
触发器类型 |
表面和后缀 |
Insert |
employee_Itg |
Update |
employee_Utg |
Delete |
employee_Dtg |
Update & Delete |
employee_UDtg |
Update & Delete & Insert |
employee_UDItg |
*假设表的名字是employee |
触发器命名
触发器的问题还远远不止本文所阐述的这些。你还需要进一步地讨论有关的主题和其它这里没有提及的内容,这样才能更深入地掌握触发器设计和实现的艺术。你可以从书店中获得第三方开发的手册和Sybase文档,这些都是理解触发器作为数据库重要部分的有用资源。本篇概述应该能帮助你开始利用它们并且理解其用途。
欢迎评论或投稿