Oracle 触发器
触发器分类:
DML触发器: 创建在表上,由DML事件触发
DDL触发器: 数据库对象创建与修改时触发
instead of触发器: 创建在视图上并且只能在行级上触发,用于替代insert,delete等操作
数据库系统事件触发: 定义在数据库或者模式上,由数据库事件触发
触发器组成:
触发事件: DML语句(insert/update/delete语句对表/视图的操作)、DDL语句(create/alter/drop语句对对象进行操作)、数据库系统事件
触发时间: 触发器在触发事件之前(before)还是之后(after)
触发操作: 触发后要做的操作
触发对象: 表、视图、模式、数据库
触发条件: 由where 子句指定逻辑表达式,只有当表达式值为 TRUE 时,才会触发操作
触发频率: 即语句级(statement)触发器和行级(row)触发器
语法&说明:
1)说明
不同类型的触发器如DML触发器,intsert of 触发器,DDL触发器语法格式存在差别
create [or replace] trigger 触发器名称 触发时间 触发时间
on 表名/视图
[for each row] -- 加上 for each row 即为行级触发器,不加时为语句触发器,建议添加
begin
pl/sql
end;
2)注意事项
在触发器执行部分只能使用DML语句(insert/update/delete/select),不能使用DDL(create/drop/alter)操作
触发器中不能使用commit,触发器操作与触发事件一起 commit和bollback
表上触发器多的话,对dml操作性能影响越大
触发器最大为32K
3)谓词
在触发多个事件时insert/update/delete 为了区分触发事件
inserting
updating
deletingg
触发器管理:
-- 禁用触发器 alter trigger 触发器名称 disable; -- 启用触发器 alter trigger 触发器名称 enable; -- 编译触发器 alter trigger 触发器名称 compile; -- 删除触发器 drop trigger 触发器名称:
DML触发器示例:
CREATE OR REPLACE TRIGGER WW.SAMPLE_GRAPH_TRI after update OR delete ON WW.SAMPLE for each row begin if updating then insert into WW.SAMPLE_HIS(trg_type,id,name) values('update',:old.id,:old.name) elsif deleting then insert WW.SAMPLE_HIS(trg_type,id,name) values('delete',:old.id,:old.name) elsif inserting then insert WW.SAMPLE_HIS(trg_type,id,name) values('insert',:old.id,:old.name) end if; exception when case_not_found then dbms_output.put_line('case error'); when others then dbms_output.put_line(sqlcode ||':'||sqlerrm); end;

浙公网安备 33010602011771号