1 1、触发器说明
2
3 触发器是一种在事件发生时隐式地自动执行的PL/SQL块,不能接受参数,不能被显式调用
4
5 2、触发器类型
6
7 根据触发器所创建的语句及所影响的对象的不同,将触发器分为以下3类
8
9 (1)DML触发器
10
11 对数据表进行DML语句操作(如insert、update、delete)时所触发的触发器,可以分为:
12
13 语句级触发器或行级触发器:行级触发器会对数据库表中的受影响的每一行触发一次触发器代码,语句级触发器则只触发一次,与语句所影响到的行数无关
14
15 before触发器或after触发器:before触发器在触发事件发生之前执行触发器代码,after触发器则在触发事件发生之后执行
16
17 语法:
18 create [or replace] trigger trigger_name
19 {before | after} trigger_event
20 on table_name
21 [for each row]
22 [when trigger_condition]
23 trigger_body
24
25 语法解释:
26
27 trigger_name:触发器名称
28
29 before | after : 指定触发器是在触发事件发生之前触发还暗示发生之后触发
30
31 trigger_event:触发事件,在DML触发器中主要为insert、update、delete等
32
33 table_name:表名,表示发生触发器作用的对象
34
35 for each row:指定创建的是行级触发器,若没有该子句则创建的是语句级触发器
36
37 when trigger_condition:添加的触发条件
38
39 trigger_body:触发体,是标准的PL/SQL语句块
40
41
42 (2)替代触发器(instead of触发器)
43
44 对视图进行操作时定义的触发器,替代触发器只能定义在视图上
45
46 语法:
47 create [or replace] trigger trigger_name --触发器名称
48 instead of trigger_event --触发事件
49 on view_name --视图名称
50 for each row --替代触发器必须指定为行级的触发器
51 [when trigger_condition] --触发条件
52 trigger_body --触发体,PL/SQL块
53
54
55 (3)系统事件触发器
56
57 对数据库实例或某个用户模式进行操作时定义的触发器,可以分为:
58
59 数据库系统触发器和用户触发器
60
61
62 3、案例
63
64 (1)DML触发器
65
66 DML触发器的案例都是基于student表和stu_log表来进行的,所以先创建student表和stu_log表
67
68 create table STUDENT
69 (
70 id NUMBER(19), --id
71 stu_no VARCHAR2(20), --学号
72 stu_name VARCHAR2(32), --姓名
73 stu_age NUMBER, --年龄
74 stu_major VARCHAR2(32) --专业
75 )
76
77 create table STU_LOG (
78 log_id NUMBER, --日志id
79 log_action VARCHAR2(100), --操作名称
80 log_date DATE, --操作时间
81 log_message VARCHAR2(32) --
82 )
83
84 a、行级触发器(before触发器)
85
86 创建触发器:实现id的隐式自增
87 create or replace trigger modify_stu
88 before insert on student – 在插入student表之前
89 for each row – 每一行都会触发这个触发器
90 declare
91 next_id number;
92 begin
93 select seq_test.nextval into next_id from dual;
94 :new.id :=next_id;
95 end;
96
97 插入一条数据,但是不插入id
98
99 insert into student(stu_no,stu_name,stu_age,stu_major) values('NO1','张三',20,'中文系');
100
101 查询结果如下,自动生成id了
102
103
104 b、 行级触发器(after触发器)
105
106 创建触发器:将对student表的操作都记录到stu_log表中(update of 用于指定一个或多个字段,指定字段被更新时才会触发触发器)
107 create or replace trigger modify_stu
108 after insert or delete or update of stu_name – 任何人对stuname这个属性进行DML操作
109 on student
110 for each row
111 begin
112 if inserting then
113 insert into stu_log values(1,'insert',sysdate,:new.stu_name);
114 elsif deleting then
115 insert into stu_log values(2,'delete',sysdate,:old.stu_name);
116 elsif updating then
117 insert into stu_log values(3,'update_old',sysdate,:old.stu_name);
118 insert into stu_log values(4,'update_new',sysdate,:new.stu_name);
119 end if;
120 end;
121
122 insert into student values(1,'NO2','李四',21,'数学系'); --插入一条数据
123 delete student where stu_name='张三'; --删除一条数据
124 update student set stu_age=19 where stu_name='李四'; --修改李四的年龄
125 update student set stu_name='王二' where stu_name='李四'; --修改李四的名称
126
127 查询stu_log表的结果如下,第3条update语句没有触发该触发器,因为触发器指定只有修改stu_name字段才会触发触发器
128
129
130 c、语句级触发器(before触发器):用来控制对表的修改
131
132 create or replace trigger modify_stu
133 before insert or update or delete on student
134 begin
135 if deleting then
136 raise_application_error(-20001,'该表不允许删除数据');
137 elsif updating then
138 raise_application_error(-20002,'该表不允许修改数据');
139 elsif inserting then
140 raise_application_error(-20003,'该表不允许插入数据');
141 end if;
142 end;
143
144 插入数据时报错如下,删除和修改数据同样也报错
145
146
147

小菜鸟之oracle触发器的更多相关文章

  1. 小菜鸟之oracle

    oracle 存储过程 函数 创建 删除 参数 传递 函数 查看 包 系统包 分类: Oracle 2011-10-27 17:31 264人阅读 评论(0) 收藏 举报   认识存储过程和函数 存储 ...

  2. 小菜鸟之Oracle数据库

    select * from STUDENT; select * from mark; select * from COURSE; select * from teacher; --注释 select ...

  3. 小菜鸟之oracle数据字典

    oracle数据字典 一.数据字典 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一组提供有关数 ...

  4. 小菜鸟之Oracle数据库之事务

    Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个 ...

  5. Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段

    在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...

  6. 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏

    触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...

  7. oracle触发器加条件判断

    oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...

  8. [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法

    连续创建多个Oracle触发器失败,单个创建才成功的解决方法   1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下:   create or replace trigger t ...

  9. Oracle 触发器在日志管理开发中的应用

    摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...

随机推荐

  1. E. The Contest ( 简单DP || 思维 + 贪心)

    传送门 题意: 有 n 个数 (1 ~ n) 分给了三个人 a, b, c: 其中 a 有 k1 个, b 有 k2 个, c 有 k3 个. 现在问最少需要多少操作,使得 a 中所有数 是 1 ~ ...

  2. Codeforces 1221 G Graph And Numbers

    题面 这种比赛时只有11个人做出来的题一般来说都是暴难的, 我也不知道我怎么搞出来的www 看完这个题第一感觉就是要容斥,至少有一条某种边的方案已经比较难求了,而直接算三种边都至少存在一条的方案数就更 ...

  3. CSP-S模拟测试 88 题解

    T1 queue: 考场写出dp柿子后觉得很斜率优化,然后因为理解错了题觉得斜率优化完全不可做,只打了暴力. 实际上他是可以乱序的,所以直接sort,正确性比较显然,贪心可证,然后就是个sb斜率优化d ...

  4. 程序猿必备的Git教程

    http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 版权声明:本文为博主原创文章,未经 ...

  5. 【locust】使用locust + boomer实现对接口的压测

    背景 很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能是python版本的5到10倍以上,但是一直没有机会使用. 最近公司想做 ...

  6. cxf报错 Cannot find any registered HttpDestinationFactory from the Bus.

    错误信息:Cannot find any registered HttpDestinationFactory from the Bus. 报错主要是因为缺少jetty依赖 一般添加如下依赖即可 < ...

  7. mongoose 建立schema 和model

    在node中使用MongoDB很多情况下,都是使用mongoose的,所以这集来介绍一下 安装 yarn add mongoose 连接 const mongoose = require(" ...

  8. Class.ForName()读取配置文件

    榨汁机(Juicer)榨汁的案例 分别有水果(Fruit)苹果(Apple)香蕉(Banana)桔子(Orange)榨汁(squeeze) public class Demo_Reflect { /* ...

  9. Qt编写安防视频监控系统6-面板开关

    一.前言 面板开关功能是整个系统最人性化的功能之一,可以对主界面中左侧右侧的各个小面板进行显示和隐藏,当隐藏的时候,另外的同级面板自动拉伸填充,这样就不会显得空洞,直接在每个面板的右上角提供了关闭按钮 ...

  10. java.lang.IllegalStateException: No primary or default constructor found for class java.time.LocalDate

    转载自:https://blog.csdn.net/Coder_Arley/article/details/81910705 springboot中报错如下: springmvc也可以使用类似处理方法 ...