Oracle学习笔记第十九天
触发器
**特性: ** 不需要显示调用来执行,而是由一个事件来启动运行
启动事件包括:
1. INSERT、UPDATE 及 DELETE 操作火堆视图进行类似的操作。
2. 执行DDL操作(create、drop、alter、)
3. 数据库的启动与关闭
-- 创建触发器的语法
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}] -- 操作的数据是完成前的数据还是完成后的数据,new是完成后的值,old是完成前的值。
[FOR EACH ROW] -- 是否是每行的,是的话就是行级触发器,不是的话就是语句触发器
[WHEN (condition)] -- 判断条件,条件为真则触发触发器
pl/sql_block; -- PL/SQL块
触发器一定是基于表或者视图
新增一定是操作完成后的值,
when 条件中数据变量不用加:
PLSQL中操作的数据需要加上: ,取值方式::new.字段名或者是 :lod.字段名
触发器类型
触发器类型 | 触发后执行模式 |
---|---|
模式(DDL)触发器 | 在模式中执行DDL语句时执行 |
数据库级触发器 | 在发生打开、关闭、登录和退出数据库等系统事件是执行 |
DML触发器 | 在对表或试图执行DML语句时执行 |
行级触发器 | 对DML语句修改的每个行执行一次 |
语句级触发器 | 无论受影响的行数是都少,都执只行一次 |
INSTEAD OF触发器 | 用于用户不能直接使用DML语句修改的视图 |
附:
-- 行级触发器中使用old变量
---依据现有表创建出员工备份表
create table emp_bak
as
select * from emp where 1 = 2; -- where 1=2 表示where后面的条件是false,所有数据都不会复制过去,只会复制表结构。
---创建触发器,一旦有数据删除,自动备份到备份表中
create or replace trigger trg_bak
before delete -- 触发模式:在删除前触发
on emp
for each row
when (old.deptno <> 10) --判断条件,这里条件是自己设定的,这里设定的条件是当删除的数据的deptno的值为10时不触发触发器。
begin
--备份数据
insert into emp_bak(empno,ename,job,sal,deptno)
values(:old.empno,:old.ename,:old.job,:old.sal,:old.deptno);
--提交事务
commit;
end;
----激活触发器 这个触发器是备份删除的数据,所以这里删除表的数据就是激活触发器。
delete from emp;
-- 行级触发器中使用new变量
---创建表跟踪员工工资的变化
create table
emp_sal_change(empno number(4),
ename varchar2(20),
old_sal number(8,2),
new_sal number(8,2));
----创建触发器
create or replace trigger trg_sal
after update on emp -- 在更新后触发
for each row
begin
insert into emp_sal_change
values(:new.empno,:new.ename,:old.sal,:new.sal);
---提交
commit;
end;
----激活触发器
update emp set sal = sal + 100 where deptno = 10;
----查询数据
select * from emp_sal_change;