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. CF796D Police Stations BFS+染色

    题意:给定一棵树,树上有一些点是警察局,要求所有点到最近的警察局的距离不大于 $d$,求最多能删几条边 ? 题解: 考虑什么时候一条边可以被断开:这条边的两个端点被两个不同的警察局覆盖掉. 我们要设计 ...

  2. Python常用知识

    基础模板(sys.os) http://c.biancheng.net/view/2407.html cmd中查看第三方库 eg:import aiohttp help(aiohttp) 或者dir( ...

  3. Gym - 102307C Common Subsequence 搞不懂的dp

    Gym - 102307C Common Subsequence 题意:给你两个相同长度的DNA序列,判断这两个的最长公共子序列长度是不是0.99*n,n为序列的长度(n<=1e5). 嗯,正常 ...

  4. react-native 打包apk 更新js和常见问题

    1.打包发布 a.在工程根目录执行如下命令 打包js资源文件 react-native bundle --platform android --dev false --entry-file index ...

  5. Python学习日记(五)——初识函数(set、深浅拷贝、三目运算、函数、全局变量和局部变量)

    基本数据类型补充 set set集合,是一个无序且不重复的元素集合 #创建 s = {11,22,33,44}#类似字典 s = set() #转换 l = (11,22,33,44) s1 = se ...

  6. SpringMVC--DispatcherServlet

    DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spri ...

  7. Spring基础环境搭建所需要的jar包

    红色标明的jar包.是spring框架开发的基础jar包. 必要jar包. spring-core-4.1.6.RELEASE.jar 框架核心jar包. spring-beans-4.1.6.REL ...

  8. 如何确定哪个SMB客户端/会话在Server 2008R2 Windows文件服务器上打开了特定文件?

    参考: http://www.kbase101.com/question/54969.html NetworkOpenedFiles v1.25  https://www.nirsoft.net/ut ...

  9. 异步机制 - IO完成端口

    1 KQUEUE KeInitializeQueue VOID KeInitializeQueue( IN PKQUEUE  Queue, IN ULONG  Count  OPTIONAL ); l ...

  10. vmware压缩vmdk文件大小

    在搭建靶机环境的过程中总是遇见vmdk越来越大,导致上传时间变长.记一下压缩vmdk的方法 ;sync;rm -f zero.fill /usr/bin/vmware-toolbox-cmd disk ...