1.1什么是触发器
数据库触发器是一个与表相关联的、存储的PL/SQL程序。每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自动地执行触发器中定义的语句序列。
触发器可用于
- 数据确认
- 实施复杂的安全性检查
- 做审计,跟踪表上所做的数据操作等
- 数据的备份和同步
触发器分类
- 前置触发器(BEFORE)
- 后置触发器(AFTER)
1.2.创建触发器的语法
语法:
CREATE [or REPLACE] TRIGGER 触发器名 BEFORE | AFTER [DELETE ][[or] INSERT] [[or]UPDATE [OF 列名]] ON 表名 [FOR EACH ROW ][WHEN(条件)] declare …… begin PLSQL 块 End ; |
FOR EACH ROW 作用是标注此触发器是行级触发器 语句级触发器
在触发器中触发语句与伪记录变量的值
触发语句 |
:old |
:new |
Insert |
所有字段都是空(null) |
将要插入的数据 |
Update |
更新以前该行的值 |
更新后的值 |
delete |
删除以前该行的值 |
所有字段都是空(null) |
1.3.触发器案例
1.3.1.前置触发器
需求:当用户输入本月累计表数后,自动计算出本月使用数 。
代码:
create or replace trigger tri_account_updatenum1 before update of num1 on t_account for each row declare begin :new.usenum:=:new.num1-:new.num0; end; |
1.3.2.后置触发器
需求:当用户修改了业主信息表的数据时记录修改前与修改后的值
--创建业主名称修改日志表:用于记录业主更改前后的名称 create table t_owners_log ( updatetime date, ownerid number, oldname varchar2(30), newname varchar2(30) );
--创建后置触发器,自动记录业主更改前后日志 create trigger tri_owners_log after update of name on t_owners for each row declare
begin insert into t_owners_log values(sysdate,:old.id,:old.name,:new.name); end; |
测试:
--更新数据 update t_owners set name='杨小花' where id=3; commit; --查询日志表 select * from t_owners_log; |