小菜鸟之oracle触发器
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触发器的更多相关文章
- 小菜鸟之oracle
oracle 存储过程 函数 创建 删除 参数 传递 函数 查看 包 系统包 分类: Oracle 2011-10-27 17:31 264人阅读 评论(0) 收藏 举报 认识存储过程和函数 存储 ...
- 小菜鸟之Oracle数据库
select * from STUDENT; select * from mark; select * from COURSE; select * from teacher; --注释 select ...
- 小菜鸟之oracle数据字典
oracle数据字典 一.数据字典 数据字典是oracle存放有关数据库信息的地方,几乎所有的系统信息和对象信息都可在数据字典中进行查询.数据字典是oracle数据库系统的信息核心,它是一组提供有关数 ...
- 小菜鸟之Oracle数据库之事务
Oracle数据库之事务 1. 什么是事务 在数据库中事务是工作的逻辑单元,一个事务是由一个或多个完成一组的相关行为的SQL语句组成,通过事务机制确保这一组SQL语句所作的操作要么都成功执行,完成整个 ...
- Oracle Sales Cloud:管理沙盒(定制化)小细节2——使用对象触发器更新数字字段
在上一篇 "管理沙盒(定制化)小细节1" 的随笔中,我们使用公式法在 "业务机会" 对象(单头)上建立了 "利润合计" 字段,并将它等于 & ...
- 2014/11/06 Oracle触发器初步 2014-11-06 09:03 49人阅读 评论(0) 收藏
触发器我就不多解释了,保证数据的完整性的神器,嗯..也是减少程序员工作托管给数据库操作的好帮手.就不讲一些大道理了.通俗点,我们对数据库的操作,无非就是增 删 改 查. 触发器就是在删,改,增的时候( ...
- oracle触发器加条件判断
oracle触发器加条件判断,如果某个字段,isnode=0,那么不执行下面的方法,数据如下: create or replace trigger tr_basestation_insert_emp ...
- [转]连续创建多个Oracle触发器失败,单个创建才成功的解决方法
连续创建多个Oracle触发器失败,单个创建才成功的解决方法 1.当我连续执行创建多个触发器时,总是报编译通过,但存在警告或错误.如下: create or replace trigger t ...
- Oracle 触发器在日志管理开发中的应用
摘要: 本文讨论了利用数据库中的触发器对日志管理进行设计与实现的方法, 是对原来在客户端软件中编写日志管理方法的一种改进, 并给出了 Oracle9i 中的实例演示.关键词: Oracle; 触发器; ...
随机推荐
- Spring Boot 如何部署到 Linux 中的服务
打包完成后的 Spring Boot 程序如何部署到 Linux 上的服务? 你可以参考官方的有关部署 Spring Boot 为 Linux 服务的文档. 文档链接如下: https://docs. ...
- Rand工具类
这篇文章已经废弃. 实际开发中,这个工具类用到得非常少. RandN是主要类,用于生成指定位数的随机字符串,具体功能在这个类中实现 Rand8是修饰了RandN中每个对外方法的修饰类,用与生成8位的随 ...
- Java 方法的重写
方法重写规则: 1.子类要重写的方法与父类方法具有完全相同的返回类型+方法名称+参数列表: 2.子类要重写的方法的访问权限大于或者等于父类方法的访问权限: 3.子类要重写的方法不能抛出比父类方法更大的 ...
- pip 安装指定版本的工具
记录一下避免忘记 安装facebook-business的版本在3.0 到 4.0之间的最新版本, == : 指定版本号 pip install "facebook-business> ...
- instr和like的使用区别
1.instr函数 instr函数是一个字符串处理函数,它在Oracle/PLSQL中是返回子字符串在源字符串中的位置,如果在源串中没有找到子串,则返回0. instr函数定义如下: /* * 返回子 ...
- Leetcode题目337:打家劫舍 III(树形DP-中等)
题目描述: 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区.这个地区只有一个入口,我们称之为“根”. 除了“根”之外,每栋房子有且只有一个“父“房子与之相连.一番侦察之后,聪明 ...
- WIN10环境下点击通知栏图标时自动切换输入法导致图标位置变动
这个问题由来已久,每当点击系统右下角任务栏中的按钮时,原本是搜狗输入法就会自动变成“US [ 中文(简体,中国) ]”,图标会自动错位,导致响应的是其他功能. 假设上图是正常的环境,此时我点击电池图标 ...
- Promise初尝试
promise.ts export function showAlert() { console.log("开始调用showAlert"); return new Promise( ...
- Gurobi建模遇到的坑
1.quicksum好像不支持嵌套 最好还是尽可能多的使用一些中间变量来表达. 另外,quicksum()返回的是表达式而不是var,像addGenConstrMax(resvar, [var, va ...
- python获取当前py文件的文件名或者当前工具箱的名字
#########################import arcpy import osimport sys ########################################## ...