Oracle DML类型触发器是Oracle开发过程中最常用和最常见的触发器,主要用于DML操作,例如: 插入,删除,更新操作事件触发器.
由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,或替换: 如果有一个同名的触发器,它将被覆盖并保存.
2. 触发器: 用于创建触发器的关键字.
3. 之前| after表示选定的触发器是数据更改之前的触发器和数据更改之后的触发器.
4,删除|插入|更新: 指示由触发器触发的事件类型是删除,插入或更新.
5,对于每行: 表示行级触发器,或者如果未填写则为语句级触发器
6,如下: 指示触发器遵循的顺序.
7,当指示触发触发条件的条件时
行级触发器通常用于验证数据或记录数据操作日志. 以下是行级触发器的示例:
情况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)更新的第一行触发器. 修改学生的班级编号后dml触发器dml触发器,修改后的记录的操作信息将记录在日志表(oplog)中.
2. 行级触发器通过新和旧,更新类型触发器访问更改后的数据以及更改前的数据,旧数据和新数据都可以访问,而删除类型触发器只能访问: 旧值,插入类型触发器只能访问访问: 新值.
创建一个触发器,我们更改一条数据以查看效果,代码如下:
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语句触发器是行级触发器,省略了每一行的措辞.
2. raise_application_error是主动向客户端抛出-20001代码错误的消息.
创建一个触发器,我们更新一条数据以查看效果,结果如下:
在同一对象上可以有多个DML触发器,但是当触发器被触发时,会有一系列触发器. 例如,前类型触发器在后类型触发器之前被触发,在此基础上,上游触发器的触发要比语句级触发器的触发早. 相同类型的触发器的顺序按关键字+触发器名称排序.
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-168275-1.html