oracle触发器记录所有dml,Oracle DML类型触发器

Oracle DML类型触发器

Oracle DML类型触发器是Oracle开发过程当中最经常用到,也是最常见的触发器,主要是对DML操作,如:insert、delete、update操作事件进行触发。

DML类型触发器安装触发的事件的前后和数据触发的类型可以分为四类:前置行级触发器、后置行级触发器、前置语句级触发器、后置语句级触发器。

创建DML类型触发器的语法结构如下:create [ or replace] trigger tr_name(触发器名)

before|after

delete| insert | update [of column1,column2...]

[or delete |insert| update of colum1,colum2...]

on table_name(表名)

[for each row]

[follows tr_name1(其它触发器名)]

[when 条件]

declare

--声明部分

begin

--触发器内容部分

end;

语法解析:

1、or replace :存在同名的触发器就覆盖保存。

2、trigger:创建触发器的关键词。

3、before|after表示是选择的触发器是数据改变之前触发、数据改变之后触发。

4、delete| insert | update:表示触发器触发的事件类型是删除、插入或更新。

5、for each row: 表示行级触发器、不填就是语句级触发器

6、follows :表示触发器的顺序是跟在哪个之后。

7、when表示触发器语句触发的条件

行级触发器

行级触发器一般用来做数据的校验或者记录数据的操作日志,下面是一个行级触发器的例子:

案例1、利用行级触发器记录更新学生信息表时的操作记录,代码如下:create or replace trigger tr_stuinfo_update

before update on stuinfo

for each row

begin

--当学生班号发生变化时,

if :new.CLASSNO <> :old.CLASSNO then

--插入操作日志表

insert into oplog

(LOGID, --日志ID

TABLENAME, --表名

COLNAME, --列名

NEWDATA, --改变后数据

OLDDATA, --改变前数据

OPDATE, --操作时间

OPERATOR) --操作人

values

(pk_oplog_id.nextval,

'stuinfo',

'classno',

:new.classno,

:old.classno,

sysdate,

'jsq');

end if;

end;

代码解析:

1、这是一个学生信息表(stuinfo)update的前置行级触发器,当修改学生的班号时,会把修改的记录的操作信息记录在日志表(oplog)中。

2、行级触发器通过:new和:old来访问变化之后的数据和变化之前的数据,update类型触发器,新旧数据都可以访问,delete类型触发器,只能访问:old值,insert类型触发器只能访问:new值。

建立好触发器,我们更改一条数据看下效果,代码如下:update stuinfo t set t.classno = 'C201802' where t.stuid = 'SC201801006';

select * from oplog;

结果如下:

1544778970159_232042.png

语句级触发器

语句级触发器一般是用来做特定限制语句操作的作用,比如在某一段时间内禁止某一部分语句操作,下面是一个语句级触发器的案例:

案例2、比如今天是12月15号,我就禁止每月的15号禁止操作学生信息表(stuinfo)的插入和删除或修改操作。代码如下:create or replace trigger tr_stuinfo_sql

before update or insert or delete on stuinfo

begin

--每月15号禁止操作学生信息表

if to_char(sysdate,'dd')='15' then

raise_application_error(-20001,'每月15号不能对学生信息表进行正删改操作!');

end if;

end;

代码解析:

1、DML语句触发器就是行级触发器省略掉for each row的写法。

2、raise_application_error是主动给客户端抛出-20001代码错误的信息。

建立好触发器,我们更新一条数据看下效果,结果如下:

1544851935976_494851.png

总结:

同一个对象上可以有多个DML触发器,但是触发器触发的时候有先后顺序,比如before型触发器比after型触发器先触发,在此基础上行级触发器,比语句级触发器更早触发。同类型的触发器的先后顺序就按follows关键词+触发器名进行排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值