日常工作的自动化往往是大型应用程序的用武之地。这种自动化使得开发者可以有时间处理更重要的事。触发器就为数据库开发者提供了自动化机制。下面我们就对sybase触发器的概念做一番介绍。
所谓数据库触发器指的是自动地对某一行为做出反应同时采取特定操作的一组SQL 语句,例如修改数据表的数据等。触发器由一个事件(针对触发器关联数据表的INSERT、DELETE或UPDATE语句)和一个行动(关联的过程)组成。触发器可以通过一致的方式检查或修改数据来保证数据的完整性。
触发器主要用来实现引用的完整性、复杂的规则或保证复制、总结或汇集的数值与详细记录同步等功能。虽然触发器在默认情况下绑定到只包含一个值的一列,不过,触发器还可以根据同一表或其他表内的其他数据有条件的采用多个缺省值。
触发器能在需要查找其他表乃至同一表的其他列的条件下强制执行复杂的引用完整性(RI)。它们能阻止主/外键的修改,甚至能防止对其他表的串联修改。许多人还认为实时地在另一个表里保存总结值(或大多数的其他衍生值)也是触发器的合理用途。触发器可以强制执行复杂的业务规则或保证更新的值同原始值的一致性。触发器胜于完整性约束的另一重要的原因在:完整性约束不便于实现有条件的事务(transaction)管理。
触发器可以被任何给定数据修改语言(DML)SQL语句触发。这些语句包括INSERT、UPDATE和DELETE,每一种语句甚至可以拥有自己的触发器。当然,我们还可以用同一触发器响应多个DML事件,只要你在CREATE语句中指定触发器响应的行动即可。
许多开发者以为该语句一次就为多个受到影响的行响应。实际上,一个触发器一次只能响应触发它的DML语句。那种认为数据行在不受影响的情况下就不会触发触发器的说法是一种常见的误解。实际上,就算没有一行受到影响,触发器也会被触发的。在操作不能满足WHERE字句的条件也会发生这种情况。触发器不被触发的唯一情况是在表约束(由创建表的CREATE语句部分定义)禁止修改数据的条件下。另外,删除触发器也不会被truncate表语句触发,而插入触发器则不会因为Writetext命令而被触发。
触发器的创建既简单又灵活
创建sybase触发器的语法如下所示:
create trigger [owner.]trigger_name
on [owner.]table_name
{for {insert , update , delete}
as SQL_statements
或者也可以采用if update子句:
create trigger [owner.]trigger_name
on [owner.]table_name
for {insert , update}
as
[if update (column_name )
[{and | or} update (column_name )]...]
SQL_statements
[if update (column_name )
[{and | or} update (column_name )]...
SQL_statements ]...
删除触发器的语法如下所示;
drop trigger <trigger_name>
如果你正在装载一个数据表而且需要加速这一过程,那么完全可以暂时禁用触发器。这种功能已经在sybase Adaptive Server 12.0中引入。禁用或再启用触发器的语法如下所示:
alter table [database_name.[owner_name].]table_name
{enable | disable} trigger [trigger_name]
为简单起见,我们创建一个防止删除和插入操作的触发器作为示范,语法如下所示:
create trigger publishers_IDtg
on publishers
for insert, delete
as
begin
print "You cannot insert or delete any records!"
rollback transaction
return
end
只要对publishers表执行了DELETE或者INSERT语句该触发器就会被触发。这还包括了其他触发器插入或删除该表内记录的状况。回滚事务(rollback
transaction)可以取消任何对数据库的修改操作事务,而这些事务就包含了引起触发器触发的SQL DELETE语句。
现在让我们创建一个触发器,它的作用就是更新的时候禁止修改主键。
create trigger publishers_Utg
on publishers
for update
as
if update( pub_id )
begin
print "You cannot Update the primary key!"
rollback transaction
return
end