pl/sql编程(五)触发器
时间:2022-09-11 22:00:00
触发器
触发器(trigger)是一些过程,与表关系密切,用于保护表中的数据,当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自动执行,例如通过触发器可实现多个表间数据的一致性和完整性。触发器和应用程序无关。
触发器的类型有三种:
(1)DML触发器。Oracle可以在DML(数据操纵语句)语句进行触发,可以在DML操作前或操作后进行触发,并且可以在每个行或该语句操作上进行触发。
(2)替代触发器。由于在Oracle中不能直接对有两个以上的表建立的视图进行操作,所以给出了替代触发器。它是Oracle专门为进行视图操作的一种处理方法。
(3)系统触发器。在Oracle8i时,提供了第三种类型的触发器叫系统触发器。它可以在Oracle数据库系统的时间中进行触发,如Oracle数据库的关闭或打开等。
创建触发器有以下限制:
(1)代码大小。触发器代码大小必须小于32K。
(2)触发器中有效语句可以包括DML语句,但不能包括DDL语句。ROLLBACK、COMMIT、SAVEPOINT也不能使用。
(3)LONG、LONG RAW和LOB的限制:
① 不能插入数据到LONG或LONG RAW;
② 来自LONG或LONG RAW的数据可以转换成字符型(如char、varchar2),但是不能超过32K;
③ 使用LONG或LONG RAW不能声明变量;
④ 在LONG或LONG RAW列中不能使用:NEW和:PARENT;
⑤ 在LOB中的:NEW变量不能修改。
每张基表最多可
建立12个触发器,它们是:
(1) BEFORE INSERT;
(2) BEFORE INSERT FOR EACH ROW;
(3) AFTER INSERT;
(4) AFTER INSERT FOR EACH ROW;
(5) BEFORE UPDATE;
(6) BEFORE UPDATE FOR EACH ROW;
(7) AFTER UPDATE;
(8) AFTER UPDATE FOR EACH ROW;
(9) BEFORE DELETE;
(10) BEFORE DELETE FOREACH ROW;
(11) AFTER DELETE;
(12) AFTER DELETE FOREACH ROW。
例如:做一个触发器,当删除dept表中部门时,将emp表中该部门人员信息清空;
create or replace trigger emp_dept
after delete on dept
for each row
declare
begin
delete from emp where emp.deptno=:old.deptno;
--表示删除或者修改前该记录旧的数据;
end emp_dept;
例如:修改上题,要求将删除的dept和emp表数据备份到指定表 deptOld和empOld表结构和dept、emp结构一致;
create or replace trigger emp_dept
after delete on dept
for each row
declare
cursor cur is select * from emp where emp.deptno=:old.deptno;
e emp%rowtype;
department dept%rowtype;
begin
delete from emp where emp.deptno=:old.deptno;
if sql%found then
open cur;
loop
fetch cur into e;
insert into empOld values(e.empno,e.ename,e.job,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno);
exit when cur%notfound;
end loop;
end if;
insert into deptOld values(:old.deptno,:old.dname,:old.loc);
end emp_dept;