现在的位置: 首页 > 综合 > 正文

触发器

2014年03月16日 ⁄ 综合 ⁄ 共 2652字 ⁄ 字号 评论关闭

--实验十 触发器
--触发器是一种特殊的存储过程。触发器主要是通过事件进行触发后被执行的,而存储过程可以通过存储过程名
--称而被直接调用。触发器是一个功能强大的工具,它使每个站点可以在有数据修改时自动强制执行其业务规则
--触发器可用于sql server约束,默认值,规则的完整性检查等。因此,他有助于更好的维护数据库中的数据的
--完整性。触发器的具体作用主要是体现在:可对数据库进行级联修改,可完成比check约束更复杂的限制:可
--发现改变前后数据表中数据的不同;对一个数据表上的不同操作可采用不同的触发器,对相同的语句也可调用
--不同的触发器完成不同的操作。
--(1)create trigger语句
--创建触发器。
--基本语法:
create trigger trigger_name
on {table | view}
[ with encryption]
{
{{for|afier|instead of}{[insert][,][update]}
[with append]
[not for replication]
as
[{if update(column)
[{and |or}update(colmun)]
[...n]
|if(column_updated(){bitwise_operator}updated_bitmask)
{comparision_operator}column_bitmask{...n]}]
sql_statement[...n]
}
}

--课本例18:
--定义一个before行级触发器,为教师表Teacher定义完整性规则“教授的工资不低于40000元,如果低于40000元,自动改为4000元”
create trigger Inser_Or_Update_Sal--在教师表teacher上定义触发器
before insert or update on teacher--触发事件是插入或者更新操作
for each row--行级触发器
as begin--定义触发动作体,这是一个pl/sql过程块
if(new.Job='教授') and (new.sal<4000) then--因为行级触发器,可在过程体中使用插入或更新操作后的新值
new.sal:=4000;
end if;
end;--触发动作结束

--课本例19 定义after行级触发器,当教师,当教师表Teacher的工资发生变化后就自动在工资变化表sal_log中增加一条记录

--定义触发器
create trigger<触发器名> 
{ before|after}<触发事件> on <表名>
for each {row|statement}
[when<触发条件>]
<触发动作体>

--相关说明:
--1.表名:当这个表的数据发生变化时,将激活定义在该表上的相应《触发事件》的触发器,因此,该表名也称为触发器的目标表
--2.触发器类型:触发器按照触发动作的间隔尺寸可以分为行级触发器(for each row)和语句级触发器(for each statement)。
--例如:假设在【例11】的Teacher表上建立一个after update触发器。如果表Teacher有1000行,执行语句:
--update Teacher set deptno=5;
--如果触发器为语句级触发器,那么执行完该语句后,触发动作只发生一次。如果是行级触发器,触发动作将执行1000次
--3.触发条件
--触发器被激活时,只有当触发条件为真时触发动作才会执行;否则触发动作不执行。如果省略when 触发条件,则触发动作体在
--触发器激活后立即执行
--4.触发体
--触发体既可以是一个匿名pl/sql过程块,也可以是对已创建存储的调用。如果是行级触发器,在两种情况下,用户都可以在过程
--体使用new和old引用update/insert事件后的新值和update/delete事件之前的旧值。如果是语句级触发器,则不能在触发动作体
--中使用new或old进行引用。
----如果触发动作执行失败,激活触发器的事件就会终止执行,触发器的目标表或触发器可能影响的其他对象不发生任何变化

--首先建立工资变化表sal_log
create trigger sal_log
(
eno numeric(4) references teacher (eno),
sal numeric(7,2),
username char(10),
date timestamp
);
create trigger inser_sal--建立触发器
after insert on teacher --触发事件是insert
for each row
as begin
insert into sal_log values(new.eno,new.sal,current_user,current_timestamp);
end;

create trigger update_sal
after update on teacher--
for each row 
as begin 
if(new.sal<>old.sal) then insert into sal_log values(
new.eno,new.sal,current_user,current_timestamp);
end if;
end;

--激活触发器
--触发器的执行,是有触发事件激活的,并由数据库服务器自动执行的。一个数据表能定义了多个触发器,比如多个defore触发器,
--多个after触发器等。同一个表上的多个触发器激活时遵循如下的执行顺序:
--(1)执行该表上的delete触发器
--(2)激活触发器的sql语句
--(3)执行该表上的after触发器
--对于同一个表上的多个begin(after)触发器,遵循“谁先创建谁先执行”的原则,按照触发器创建的时间先后顺序执行。有些
RDBMS是按照触发器名称的字母排序顺序执行触发器。
--例:20:
--执行某个教师的工资的sql语句,激活上述定义的触发器。
update Teacher set sal=800 where ename='陈平'
--执行顺序是:
--a,执行触发器Insert_or_Update_sal
--b,执行sql语句“update teacher set sal=800 where ename='陈平'”;
--c,执行触发器Insert_sal
--d,执行触发器Update_sal

--删除触发器:
--drop trigger triggername on tablename
--触发器必须是一个已经创建的触发器,并且只能由具有相应权限的用户删除

抱歉!评论已关闭.