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. LibreOJ #102. 最小费用流

    二次联通门 : LibreOJ #102. 最小费用流 /* LibreOJ #102. 最小费用流 Spfa跑花费 记录路径 倒推回去 */ #include <cstring> #in ...

  2. (RERERERERERERERERERERE) BZOJ 2746: [HEOI2012]旅行问题

    二次联通门 : BZOJ 2746: [HEOI2012]旅行问题 神TM STL的vector push_back进一个数后取出时就变成了一个很小的负数.. 调不出来了, 不调了 #include ...

  3. 汇编语言学习-Dos下的调试工具debug的使用教程

    1.常用的debug功能 (1)用Debug的R命令查看.改变CPU寄存器内容: (2)用Debug的D命令查看内存中的内容: (3)用Debug的E命令查看内存中的内容: (4)用Debug的U命令 ...

  4. Python学习日记(四)——Python基本数据类型梳理(int、str、list、tuple、dict)

    数字(int) 1.创建方式 n1 = 123 n2 = int(123) 2.内存分配 #共同用一个内存地址的情况 n1 = 123 n2 = n1 #用两个内存地址的情况 n1 = 123 n2 ...

  5. cas系列-cas server demo搭建(二)

    一 部署简述 cas server官方推荐采用overlay方式进行部署,通过替换自定义文件,减少项目文件改动,以简化开发和部署,这个有点类似于项目上直接替换java的class文件,由于和git的搭 ...

  6. mysql 中常用的 sql 语句

    SQL分类: DDL-----数据定义语言(CREATE--创建,ALTER--修改. DROP--删除表,DECLARE--声明) DML-----数据定义语言(SELECT--查询,DELECT- ...

  7. v-on绑定特性命名带小横杠 ‘-’与props属性中变量怎么对应

    特性命名问题: 矛盾点一:html的特性不区分大小写 矛盾点二:Vue中除了模板命名,其他命名不允许出现小横杠 ‘-’ 在js文件内,命名为驼峰式,camerCase,进入html文件,自动转换成短横 ...

  8. 关于ios在H5页面长按识别二维码无效

    环境 框架: vue 操作系统: ios 解决 如果你的vue-router用了mode:history: 把它去掉用默认的就OK了

  9. uni-app 使用 iconfont 图标 自定义图标

    uni-app 的uni-ui 的 Icon 图标组件,裡面的图标只是移动端常见的图标,对于一些其他需求所要显示的图标,这个是完全不够用.那么怎么办?模仿它的组件,用阿里巴巴图标矢量库的图标,自己定义 ...

  10. Java NIO 学习笔记 读写结合补充

    小练习:nio读写文件,将fileread中的内容读取到filewrite中 try { //创建输入通道 FileInputStream fis = new FileInputStream(&quo ...