触发器
触发器在数据库中以独立的对象存储,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火。ORACLE 事件指的是对数据库的表进行的INSERT、UPDATE 及 DELETE 操作或对视图进行类似的操作。
触发器组成
- 触发事件:即在何种情况下触发trigger。例如INSERT、UPDATE 及 DELETE
- 触发时间:是在触发事件发生之前(BEFORE)还是之后(AFTER)触发
- 触发器本身:即触发之后的目的和意图, 触发器本身要做的事。例如:PL/SQL 块
- 触发频率:语句级(STATEMENT)触发器和行级(ROW)触发器
- 语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次
- 行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一
次
创建触发器
create or replace trigger name_trigger
before/after insert/update/delete of(列) on 表名 (for each row)
trigger_body;
触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。
触发器体内的 SELECT 语句只能为 SELECT … INTO …结构,或者为定义游标所使用的 SELECT 语句。
触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句。调用的过程或函数也不能使用。
触发器的触发顺序
1.执行 BEFORE 语句级触发器;
2.对与受语句影响的每一行:
执行 BEFORE 行级触发器
执行 DML 语句
执行 AFTER 行级触发器
3.执行 AFTER 语句级触发器
每张表最多可建立 12 种类型的触发器:
BEFORE INSERT
BEFORE INSERT FOR EACH ROW
AFTER INSERT
AFTER INSERT FOR EACH ROW
BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDATE
AFTER UPDATE FOR EACH ROW
BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW
:NEW , :OLD
:NEW 修饰符 访问操作完成后的列的值
:OLD 修饰符 访问操作完成前的列的值
insert | update | delete |
---|---|---|
:OLD | null | 有效 |
:NEW | 有效 | 有效 |
行级触发器:
create or replace trigger del_emp
after delete on emp for each row
begin
insert into emp_del (employee_id,last_name,hire_date,job_id,salary,department_id)
values (:old.employee_id,:old.last_name,:old.hire_date,:old.job_id,:old.salary,:old.department_id);
dbms_output.put_line('触发del_emp');
end;
语句级触发器:
create or replace trigger del_emp1
after delete on emp
begin
insert into emp_del (employee_id,last_name,hire_date,job_id,salary,department_id)
values (1,1,sysdate,1,1,1);
end;
例题:建立触发器,当修改emp中的salary大于或等于3000时触发
create or replace trigger update_emp
after update on emp for each row
begin
if :new.salary-:old.salary >=3000 then
dbms_output.put_line(:new.employee_id|| '涨工资啦!');
end if;
end;