13.Oracle DML类型触发器

主要是对DML操作,如:insert、delete、update操作事件进行触发。
四类:

  • 前置行级触发器
  • 后置行级触发器
  • 前置语句级触发器
  • 后置语句级触发器

语法结构

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;

语句级触发器

语句级触发器一般是用来做特定限制语句操作的作用,比如在某一段时间内禁止某一部分语句操作
案例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代码错误的信息。

posted @ 2022-12-15 17:21  种太阳  阅读(96)  评论(0编辑  收藏  举报