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. learning express step(五)

    learning  express  middleware var express = require('express'); var app = express(); var myLogger = ...

  2. 配置apt源

    vim /etc/apt/source.list 配置完成后执行 apt update apt upgrade 配置完源之后,就可以在源中所有想要的包 apt search xxx 本地自带的源配目录 ...

  3. codeforces 1272F dp+记录路径

    题意 给出两个括号序列 \(S\) 和 \(T\),让你构造一个最短的合法括号序列使 \(S\) 和 \(T\) 是它的子序列. 分析 设 \(dp[i][j][k]\) 为这个最短的合法括号序列的前 ...

  4. Break Standard Weight (ZOJ 3706)

    Problem The balance was the first mass measuring instrument invented. In its traditional form, it co ...

  5. Win内核原理与实现学习笔记1-windows内核版本列表

  6. 使用setUncaughtExceptionHandler在线程外面捕获异常

    package com.dwz.concurrency.chapter11; /** * Thread的run方法是不能throw出异常的,只能在日志或者console中打印出来 */ public ...

  7. VS2010,VS2013 Datagridview控件的编辑列功能,弹窗界面被挤扁了

    搜了很久,没找到解决办法,在一个角落看到说要卸载Framework,实践后可以,发出来记一下. 解决办法: 发现自己电脑上多了Framework4.8,可能安装VS2013的时候自动安装的. 卸载了F ...

  8. 入门display:inline-block运用

    这是我第一篇博客,是我新的开始,我要用博客记录我的学习之旅,在这里我要感谢我的哥哥,他带我开阔了眼界,纠正了我的格局,给我带来了正能量.我是一个小白,学习的路还很长很长,学习了10天HTML与css, ...

  9. PHP魔术方法和魔法变量详解

    一.魔术常量 __LINE__ 文件中的当前行号.__FILE__ 文件的完整路径和文件名.如果用在被包含文件中,则返回被包含的文件名. 自 PHP 4.0.2 起,__FILE__ 总是包含一个绝对 ...

  10. Kotlin 中类函数

    在kotlin中函数可以在类外部定义也可以在类内部定义,前者即为全局函数,后者,是类成员函数,语法一样 package loaderman.demo class Person { fun demo(n ...