一、定义
每当一个特定的数据库操作语句(insert,update,delete)在指定的表上发出时,oracle会自动执行触发器中定义的语句序列
二、创建触发器的语法
CREATE [OR REPLACE] TRIGGER 触发器名
BEFORE|AFTER
[DELETE][[or] INSERT] [[or]UPDATE [OF 列名]]
ON 表名
[FOR EACH ROW ][WHEN(条件) ]
declare
...
begin
PLSQL 块
End ;
三、触发器类别
触发器分为行级触发器
和语句级触发器
,
行级触发器(ROW):sql语句执行后影响了多少行,将会指定对应次数触发器逻辑
语句级触发器(STATEMENT):如果只执行了一次sql语句,那么将只会执行一次触发器逻辑
四、伪记录变量
在触发器中触发语句伪记录变量
的值:
触发语句 | :old | :new |
---|---|---|
Insert | 所有字段都是空(null) | 将要插入的数据 |
Update | 更新以前该行的值 | 更新后的值 |
Delete | 删除以前的值 | 所有字段都是空(null) |
伪记录变量只能用于行级触发器
五、案例
5.1 前置触发器
5.1.1 需求
现在修改firstname时,会在lastname后追加'_'
5.1.2 创建触发器
-- 前置触发器
create or replace trigger my_tri
before
update of first_name
on HR.EMPLOYEES
for each row
declare
begin
-- 通过伪记录变量修改last_name字段的值
:new.last_name:=:new.last_name || '_';
end;
5.1.3 查看触发器
5.1.4 测试
执行前:现在要将id为100的员工名字修改为tom
执行后:lastname自动追加了“”
5.2 后置触发器
注:后置触发器无法修改绑定的
数据表值
5.2.1 需求
现在在修改员工名称后,将会自动将修改记录存入日志表中,日志表字段如下:
-- 创建日志表
create table t_name_log(
update_time date,
employee_id number,
old_name varchar2(30),
new_name varchar2(30)
);
5.2.2 创建触发器
-- 后置触发器
create or replace trigger my_tri_after
after
update of first_name
on HR.EMPLOYEES
for each row
declare
begin
-- 向日志表插入记录
insert into t_name_log values(sysdate,:new.employee_id,:old.first_name,:new.first_name);
end;
5.2.3 测试
执行前:现在要将id为101的员工名称修改为xyy
执行后:日志表中自动插入相关信息