ORACLE触发器(trigger)的使用

ORACLE触发器(trigger)的使用1、触发器说明触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用2、触发器语法create[orreplace]triggertrigger_name{before|after|insteadof}trigger_eventon{table_name|view_name}[foreachrow]beginPL/SQL语句…

大家好,又见面了,我是你们的朋友全栈君。

1、触发器说明

触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用

2、触发器类型

根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下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了

ORACLE触发器(trigger)的使用

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字段才会触发触发器

ORACLE触发器(trigger)的使用

 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;

插入数据时报错如下,删除和修改数据同样也报错

ORACLE触发器(trigger)的使用

 d、语句级触发器(after触发器):略

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/159857.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 机器学习 — 多项式回归

    机器学习 — 多项式回归前言在面对一些简单的线性问题时。线性回归能够用一个直线较为精确地描述数据之间的关系。但对于复杂的非线性数据问题时。线性回归的效果就大大不如意了。对特征数据进行多项式变化,再使用线性回归的做法就能提高模型的拟合效果,这种方法就是多项式回归。从面对上图1中的数据,线性回归不能准确描述数据关系。无论一次方、二次方、三次方、四次方都不能单独完美拟合数据。在多项式中集成了一次方、二次方、三次方、四次方…

    2025年6月17日
    1
  • centos7安装python 3.7_python安装后如何使用

    centos7安装python 3.7_python安装后如何使用文章目录什么是EPEL更新一下yum:安装EPEL:安装python3使用python3什么是EPELRHEL以及他的衍生发行版如CentOS、ScientificLinux为了稳定,官方的rpmrepository提供的rpm包往往是很滞后的,当然了,这样做这是无可厚非的,毕竟这是服务器版本,安全稳定是重点,官方的rpmrepository提供的rpm包也不够丰富,很多时候需要自己编译那太辛苦了,而EPEL恰恰可以解决这两方面的问题。什么是EPEL?EPEL的全称叫ExtraPackag

    2022年9月25日
    1
  • 如何求最长回文子串

    如何求最长回文子串回文字符串,就是像“12321”这种轴对称形式的字符串,系不系很简单呀(狗头)。但并不是所有的字符串都是这种整个串都是回文串的。有些计算机问题就是在一个字符串中找出一段最长的回文字符子串,这个时候时候,我们会很自然的想到一种暴力的方法来解决。1975年,一位叫Manacher的人发明了一个算法,这个算法是用来查找一个字符串的最长回文子串的方法。…

    2022年5月8日
    50
  • virsh 关机_kvm 虚拟化 virsh shutdown 无法关闭虚拟机[通俗易懂]

    virsh 关机_kvm 虚拟化 virsh shutdown 无法关闭虚拟机[通俗易懂]问题:安装kvm虚拟化并且安装客户机之后,通过virshshutdown命令无法关闭客户机,只能通过virshdestroy进行强制关闭电源。虽然这也是一种方法,但是直接断电显然有点不妥,并且你并不知道何时会出现一些奇奇怪怪的问题。在下图中我分别对客户机centos6.5和hongxuecentos6.5试图执行virshshutdown进行正常关闭,输出信息为:D…

    2022年8月11日
    7
  • pycharm2021.3激活 3月最新注册码

    pycharm2021.3激活 3月最新注册码,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月14日
    101
  • codeblocks怎么设置中文[通俗易懂]

    codeblocks怎么设置中文[通俗易懂]1下载语言包local2将语言包解压后放进新的位置codeblocks里面share的位置例如E:\新建文件夹\codeblocks\CodeBlocks\share\CodeBlocks然后进入codeblocks点击导航条的setting然后点击第二的大图标(视图)在里面选择长条框里选择中文就可以了。重启一下语言包的资源:https://pan.baidu.com/s/1SXYKt…

    2022年7月15日
    80

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号