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;

 

posted @ 2025-10-21 16:46  一个苦逼的运维人  阅读(17)  评论(0)    收藏  举报