触发器 TRIGGER
定义
触发器是一种特殊类型的存储过程,主要是通过事件进行触发而被执行的;而存储过程是通过存储过程名而被直接调用。
作用
实现由主键和外键所不能保证的复杂的参照完整性和数据的一致性。
如:
1. 强化约束(enforce restriction)
触发器能够实现比 check 语句更为复杂的约束。
2. 跟踪变化(auditiong changes)
触发器可以侦测数据库内的操作,从而不允许数据库中未经许可的指定更新和变化。
3. 级联运行(cascaded operation)
触发器可以侦测数据库内的操作并自动地级联影响整个数据库的各项内容。
4. 存储过程的调用(stored procedure invocation)
为了影响数据库更新,触发器可以调用一个或多个存储过程,甚至可以通过外部过程的调用而在 DBMS 本身之外进行操作。
语法
CRATE [ OR REPLACE ] TRIGGER trigger_name trigger_time trigger_event
ON { table_name or view_name | DB }
[ REFERENCING [ OLD [ AS ] < OLD > ] [ NEW [ AS ] < NEW > ] ]
[ FOR EACH ROW[ WHEN CONDITION ] ]
tirgger_body
KEYWORDS
trigger_name 触发器对象的名称
因为触发器由数据库自动执行,所以该名称只是一个名称,没有实质的用途。
trigger_time 触发时间 指明触发器何时执行
1. before 表示在数据库动作之前触发器执行。
2. after 表示在数据库动作之后触发器执行。
3. instead of 触发器被触发但相应的操作并不被执行,而运行的仅仅是触发器 SQL 语句本身。(仅作用于 视图)
trigger_event 触发事件 指明哪些数据库动作会触发此触发器
1. insert 当向表或者视图插入一行时触发触发器。
2. update 更新表或视图中的某一行时触发触发器。
3. delete 从表或视图中删除某一行时触发触发器。
4. create 当使用 crate 语句为创建一个数据库对象时触发触发器。
5. alter 当使用 alter 语句为更改一个数据库对象时触发触发器。
6. drop 当使用 drop 语句为删除一个数据库对象时触发触发器。
7. start 打开数据库时触发触发器。在事件后触发。
8. shutdown 关闭数据库时触发。在事件前触发。
9. logon 当一个会话建立时触发,事件前触发。
10. logoff 当会话关闭时触发,事件前触发。
11. server 服务器发生错误时触发触发器。事件后触发。
table_name or view_name 数据库触发器所在的表或视图。
referencing
为 old 和 new 两个变量指定别名。
for each row
指明触发器是行级触发器还是语句级触发器。
如果说明了 for each row 则表示对触发语句所影响表的每一行触发器都执行一次。
缺少 for each row 则表示对于每一个可应用语句,触发器只触发一次,而不是针对每一个语句所影响的行各触发一次。
when
when 子句是一个 SQL 布尔表达式,用于每一行语句中进行条件检索。when 子句不能与 instead of 子句共用。
触发器禁用/启用
ALTER TRIGGER trigger_name DISABLE
ALTER TRIGGER trigger_name ENABLE
禁用/启用表的所有触发器
ALTER TRIGGER table_name ALL DISABLE
ALTER TRIGGER table_name ALL ENABLE
删除
DROP TRIGGER trigger_name
INSERTING、UPDATING 和 DELETING
EXAMPLE
create table tm as select * from emp;
truncate table tm;
create table emplog
(
act_id number(7),
act_time date,
act_desc varchar2(20)
);
create sequence emp_trigger_seq;
select * from emplog;
create or replace trigger emp_trigger
after insert or update or delete on tm
for each row
declare
operation varchar2(20);
begin
if inserting then
operation := 'inserted success!';
end if;
if updating then
operation := 'updated success!';
end if;
if deleting then
operation := 'deleted success!';
end if;
insert into emplog values (emp_trigger_seq.nextval, sysdate, operation);
end;
insert into tm values(7639,'RMB','SALESMAN',7902,to_date('2010-12-23','YYYY-MM-DD'), 1200,null,40);
update tm set ename='XXX' where empno=7639;
delete tm where empno=7639;
select * from tm;
select * from emplog;