什么是触发器
数据库触发器是一个与表相关联的、存储的 PL/SQL 程序。每当一个特定的 数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle 自动地执行触发 器中定义的语句序列。
触发器可用于
- 数据确认
- 实施复杂的安全性检查
- 做审计,跟踪表上所做的数据操作等
- 数据的备份和同步
触发器分类 - 前置触发器(BEFORE)
- 后置触发器(AFTER)
创建触发器的语法
语法:
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.前置触发器
需求:当用户输入本月累计表数后,自动计算出本月使用数 。
代码:
--前置触发器
create or replace trigger tri_account_num1
before
update of num1
on t_account
for each row
declare
begin
--通过伪记录变量修改usenum字段的值
:new.usenum:= :new.num1-:new.num0;
end;
2.后置触发器
需求:当用户修改了业主信息表的数据时记录修改前与修改后的值
--后置触发器
--创建日志表,记录业主名称修改前和修改后的名称
create table t_owners_log(
updatetime date,
ownerid number,
oldname varchar2(30),
newname varchar2(30)
);
create or replace trigger tri_owners_log
after
update of name
on t_owners
for each row
declare
begin
--向日志表插入记录
insert into t_owners_log values(sysdate,:new.id,:old.name,:new.name);
end;
测试:
--更新数据
update t_owners set name='张八天' where id=3;
commit;
--查询日志表
select * from t_owners_log;