ORACLE触发器
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了ORACLE触发器,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3981字,纯文字阅读大概需要6分钟。
内容图文
根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下3类
(1)DML触发器
对数据表进行DML语句操作(如insert、update、delete)时所触发的触发器,可以分为:
语句级触发器或行级触发器:行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,语句级触发器则只触发一次,与语句所影响到的行数无关
before触发器或after触发器:before触发器在触发事件发生之前执行触发器代码,after触发器则在触发事件发生之后执行
- 语法:
- create [or replace] trigger trigger_name
- {before | after} trigger_event
- on table_name
- [for each row]
- [when trigger_condition]
- trigger_body
语法解释:
trigger_name:触发器名称
before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发
trigger_event:触发事件,在DML触发器中主要为insert、update、delete等
table_name:表名,表示发生触发器作用的对象
for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
when trigger_condition:添加的触发条件
trigger_body:触发体,是标准的PL/SQL语句块
(2)替代触发器(instead of触发器)
对视图进行操作时定义的触发器,替代触发器只能定义在视图上
- 语法:
- create [or replace] trigger trigger_name --触发器名称
- instead of trigger_event --触发事件
- on view_name --视图名称
- for each row --替代触发器必须指定为行级的触发器
- [when trigger_condition] --触发条件
- trigger_body --触发体,PL/SQL块
(3)系统事件触发器
对数据库实例或某个用户模式进行操作时定义的触发器,可以分为:
数据库系统触发器和用户触发器
3、案例
(1)DML触发器
DML触发器的案例都是基于student表和stu_log表来进行的,所以先创建student表和stu_log表
- create table STUDENT ---创建student表
- (
- id NUMBER(19), --id
- stu_no VARCHAR2(20), --学号
- stu_name VARCHAR2(32), --姓名
- stu_age NUMBER, --年龄
- stu_major VARCHAR2(32) --专业
- )
- create table STU_LOG ---创建stu_log表,用于记录对student表的操作日志
- (
- log_id NUMBER, --日志id
- log_action VARCHAR2(100), --操作名称
- log_date DATE, --操作时间
- log_message VARCHAR2(32) --
- )
a、行级触发器(before触发器)
- 创建触发器:实现id的隐式自增
- create or replace trigger modify_stu
- before insert on student
- for each row
- declare
- next_id number;
- begin
- select seq_test.nextval into next_id from dual;
- :new.id :=next_id;
- end;
插入一条数据,但是不插入id
insert into student(stu_no,stu_name,stu_age,stu_major) values(‘NO1‘,‘张三‘,20,‘中文系‘);
查询结果如下,自动生成id了
b、 行级触发器(after触发器)
- 创建触发器:将对student表的操作都记录到stu_log表中(update of 用于指定一个或多个字段,指定字段被更新时才会触发触发器)
- create or replace trigger modify_stu
- after insert or delete or update of stu_name
- on student
- for each row
- begin
- if inserting then
- insert into stu_log values(1,‘insert‘,sysdate,:new.stu_name);
- elsif deleting then
- insert into stu_log values(2,‘delete‘,sysdate,:old.stu_name);
- elsif updating then
- insert into stu_log values(3,‘update_old‘,sysdate,:old.stu_name);
- insert into stu_log values(4,‘update_new‘,sysdate,:new.stu_name);
- end if;
- end;
- insert into student values(1,‘NO2‘,‘李四‘,21,‘数学系‘); --插入一条数据
- delete student where stu_name=‘张三‘; --删除一条数据
- update student set stu_age=19 where stu_name=‘李四‘; --修改李四的年龄
- update student set stu_name=‘王二‘ where stu_name=‘李四‘; --修改李四的名称
查询stu_log表的结果如下,第3条update语句没有触发该触发器,因为触发器指定只有修改stu_name字段才会触发触发器
c、语句级触发器(before触发器):用来控制对表的修改
- create or replace trigger modify_stu
- before insert or update or delete on student
- begin
- if deleting then
- raise_application_error(-20001,‘该表不允许删除数据‘);
- elsif updating then
- raise_application_error(-20002,‘该表不允许修改数据‘);
- elsif inserting then
- raise_application_error(-20003,‘该表不允许插入数据‘);
- end if;
- end;
插入数据时报错如下,删除和修改数据同样也报错
d、语句级触发器(after触发器):略
ORACLE触发器
标签:line 触发事件 creat 专业 oracl keyword varchar2 condition sso
本文系统来源:https://www.cnblogs.com/yuesebote/p/10693442.html
内容总结
以上是互联网集市为您收集整理的ORACLE触发器全部内容,希望文章能够帮你解决ORACLE触发器所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。