PL/SQL 触发器
触发器是当特定事件出现时自动执行的存储过程
特定事件可以是执行更新的DML语句和DDL语句
触发器不能被显式调用
触发器的功能:
自动生成数据
自定义复杂的安全权限
提供审计和日志记录
启用复杂的业务逻辑
创建触发器的语法:
CREATE [OR REPLACE] TRIGGER trigger_name
AFTER | BEFORE | INSTEAD OF
[INSERT] [[OR] UPDATE [OF column_list]]
[[OR] DELETE]
ON table_or_view_name
[REFERENCING {OLD [AS] old / NEW [AS] new}]
[FOR EACH ROW]
[WHEN ( condition ) ]
pl/sql_block;
还有:new or :old这俩参数
分别代表:执行语句后的参数(new)、执行语句前的参数(old)
触发器语法解释:
create or replace trigger 触发器名字
before or after –触发时间
insert or update or delete –触发事件
on table_or_view_name –触发对象
for each row –触发频率
when condition –触发条件
PL/SQL;
触发事件:引起触发器被触发的事件。例如:DML语句(insert,update,delete)对表或试图执行操作
触发时间:before,after
触发操作:触发器意图
触发对象:表、视图、模式、数据库
触发条件:由when子句指定
触发频率:说明触发器定义的动作被执行的次数
注意事项:
1、触发器不接受任何参数
2、一个表上最多可有12个触发器,但同一事件,同一类型的触发器只能有一个,并各触发器之间不能有矛盾
3、触发器最大为32KB,如果有需要,可有先建立过程,然后调用
4、在触发器主体中不能使用事务控制语句
5、在触发器主体中不能申明任何的Long和Blob变量
代码示例:
CREATE TABLE emp_test AS SELECT * FROM emp WHERE 1=2;--创建测试表,用来保存删除的数据 SELECT * FROM emp_test; --创建触发器,当emp_pyb表中的数据被删除时,将其数据保存至emp_test CREATE OR REPLACE TRIGGER tr_del_emp BEFORE--在语句执行前触发 DELETE--指定语句,DELETE表示当执行删除语句时触发 ON emp_pyb--指定表名或视图名,只有在此表/视图上执行的DELETE语句才会执行触发器 FOR EACH ROW BEGIN INSERT INTO emp_test(empno,ename,job,sal,deptno) VALUES(:old.empno,:old.ename,:old.job,:old.sal,:old.deptno); END;
--禁止工资下调 CREATE OR REPLACE TRIGGER tr_saldown* BEFORE UPDATE ON emp_pyb FOR EACH ROW WHEN(new.sal<old.sal) BEGIN RAISE_APPLICATION_ERROR(-20001,:old.ename||'的工资不能更低了!!!!'); END;