ORACLE 触发器其实是PL/SQL块,它类似于存储过程和函数,不过有一点不同的是,触发器是隐式调用的,并不能接收参数.    ORACLE触发器有三种类型,分别是:DML触发器, 替代触发器和系统触发器. 下面对这三种类型一一进行讲述

1.DML触发器

顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT/UPDATE/DELETE操作都可以触发该类型的触发器. 它们可以在这些语句之前或之后触发,或者在行级上触发(就是说对于每个受影响的行都触发一次)

例如我们有一张表TABLE1 ,总共有三个字段  ID,姓名,年龄 ,当我们在插入时希望ID可以自动生成,那么可以建立一个触发器

CREATE OR REPLACE TRIGGER TR_INSERT_ID 

BEFORE INSERT ON  TABLE1

BEGIN

 SELECT  T.NEXTVAL INTO :NEW.ID FROM DUAL;

END;

那么当我们插入该表的时候,ID字段会自动填充.

2.替代触发器

替代触发器只能使用在视图上,与DML不同的是,DML触发器是运行在DML之外的,而替代触发器是代替激发它的DML语句运行.替代触发器是行级,举个例子,这里有个视图:

--例子来源insteadOf.sql

CREATE OR REPLACE VIEW classes_rooms AS
SELECT department, course, building, room_numbe
FROM rooms, classes
WHERE rooms.room_id = classes.room_id;

直接对视图进行插入操作非法的.因为插入操作要求对两个表都进行修改,例如

--例子来源insteadOf.sql

如果使用替代

INSERT INTO classes_rooms (department, course, building,
room_number)
2    VALUES ('MUS', 100, 'Music Building', 200);
INSERT INTO classes_rooms (department, course, building, room_number)
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view

触发器,那么就可以解决这个问题:

CREATE TRIGGER ClassesRoomsInsert
INSTEAD OF INSERT ON classes_rooms
DECLARE
v_roomID rooms.room_id%TYPE;
BEGIN
-- First determine the room ID
SELECT room_id
INTO v_roomID
FROM rooms
WHERE building = :new.building
AND room_number = :new.room_number;
-- And now update the class
UPDATE CLASSES
SET room_id = v_roomID
WHERE department = :new.department
AND course = :new.course;
END ClassesRoomsInsert;

该触发器就可以正常工作了

3.系统触发器

这种触发器是发生在如数据库启动或关闭等系统事件时,不是在执行DML语句时发生,当然也可以在DDL时触发.

不管是以上三种的哪一种,创建的语法都是一致的.

CREATE [OR REPLACE] TRIGGER trigger_name
...{BEFORE | AFTER | INSTEAD OF} triggering_event
referencing_clause
[WHEN trigger_condition]
[FOR EACH ROW]
trigger_body;

其中,t r i g g e r _ n a m e是触发器的名称,t r i g g e r i n g _ e v e n t说明了激发触发器的事件(也可能包
括特殊的表或视图),t r i g g e r _ b o d y是触发器的代码。r e f e r e n c i n g _ c l a u s e用来引用正在处于修改状
态下的行中的数据,如果在 W H E N子句中指定t r i g g e r _ c o n d i t i o n的话,则首先对该条件求值。触
发器主体只有在该条件为真值时才运行.

因为DML触发器对我们开发人员来说是最常用的,所以这里首先详细对DML触发器进行详细讲解:

DML触发器是由数据库的INSERT/UPDATE/DELETE操作触发.该类触发器可以在上述语句之前或之后执行,也可以每个受影响的行执行一次,所以这些条件组合,那么可以组合出12种类型的DML触发器.这里有一个表给出了DML触发

表6-1   DML触发器类型
类 别                                   值                                              说 明
语句                      I N S E RT、D E L E T E、      定义何种D M L语句激发触发器
                             U P D AT E
定时                       之前或之后                               定义触发器是在语句运行前或运行后激发
级                       行或语句                                     如果触发器是行级触发器,该触发器就对由触发语句变更的
                                                                                每一行激发一次。如果触发器是语句级的触发器,则该触发
                                                                                器就在语句之前或之后激发一次。行级触发器是按触发器定
                                                                               义中的FOR EACH ROW子句表示的

需要注意的一点是:触发器是与触发该类型的语句一起作为一个失误来运行的.

触发器是在D M L语句运行时激发的,如果有多个触发器,执行的顺序如下:
1) 如果有语句之前级触发器的话,先运行该触发器
2) 对于受语句影响每一行:
a. 如果有行之前级触发器的话,运行该触发器。
b. 执行该语句本身。
c. 如果有行之后级触发器的话,运行该触发器。
3) 如果有语句之后级触发器的话,运行该触发器

并且对于行级触发器,可以通过:NEW和:OLD标志来访问正在处理中的行数据. 对于DML触发器,这两个标志符的意义如下:

触发语句                           标识符: o l d                                           标识符: n e w
I N S E RT           无定义-所有字段为空N U L L                    该语句结束时将插入的值
U P D A E                 更新前行的原始值                               该语句结束时将更新的值
D E L E T E          行删除前的原始值                                无定义-所有字段为空N U L L

注意 标识符 : o l d对I N S E RT语句无定义,而标识符 : n e w对D E L E T E语句无定义。
P L / S Q L编译器不会对在I N S E RT语句中使用的: o l d和在D E L E T E语句中使用的: n e w标识
符报错,编译的结果将使该字段为空。同时,我们不能在行级触发器之后改变 : n e w,其原因是该语句已被处理了。总的来说,对: n e w的修改只能在行级触发器之前修改。:o l d具有只读属性,只能读入。

n e w和: o l d只在行级触发器内部合法。如果企图引用在语句级触发器之内的: n e w
或: o l d的话,编译器将报错。由于语句级的触发器只运行一次,即使存在很多被语句处理过的行
的话,n e w和: o l d也没有定义。编译器不知道该引用那一行

WHEN子句
W H E N子句只适用于行级触发器。如果使用该子句的话,触发器体将只对满足由 W H E N子
句说明的条件的行执行。W H E N子句的语法是:
WHEN trigger_condition
其中,t r i g g e r _ c o n d i t i o n是逻辑表达式。该表达式将为每行求值。 : n e w和:o l d记录可以在
t r i g g e r _ c o n d i t i o n内部引用,但不需使用冒号。该冒号只在触发器体内有效。例如,触发器
C h e c k C r e d i t s的体只在当前的学生得到的学分超出2 0时才运行:
CREATE OR REPLACE TRIGGER CheckCredits
BEFORE INSERT OR UPDATE OF current_credits ON students
FOR EACH ROW
WHEN (new.current_credits > 20)
BEGIN
/* Trigger body goes here. */
END;

触发器谓语:I N S E RT I N G、U P D AT I N G和D E L E T I N G
触发器的内部(为不同的 D M L语句激发的触发器)有三个可用来确认执行何种操作的逻辑表
达式。这些表达式的谓语是 I N S E RT I N G、U P D AT I N G、D E L E T I N G。下面说明了每个谓词的
含义。
表达式谓语                                       状 态
I N S E RT I N G     如果触发语句是I N S E RT的话,则为真值(T R U E),否则为FA L S E
U P D AT I N G    如果触发语句是U P D AT E的话,则为真值(T R U E),否则为FA L S E
D E L E T I N G    如果触发语句是D E L E T E的话,则为真值(T R U E),否则为FA L S E

转载于:https://www.cnblogs.com/lovingprince/archive/2007/03/24/2166456.html

ORACLE数据库触发器相关推荐

  1. oracle 数据库 触发器 trigger 语法

    http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...

  2. oracle数据库触发器是否生效,Oracle数据库触发器

    第一次写触发器,浪费了一个小时,少了一个;编译不通过 当A表有更新或插入数据时,则触发器执行向B表插入对应条件的数据 1 CREATE OR REPLACE TRIGGER Test -- 触发器名称 ...

  3. Oracle数据库——触发器的创建与应用

    一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...

  4. oracle中触发器作用,详细解析Oracle数据库触发器的功能种类及其作用

    触发器是一种特殊类型的存储过程,它不同于存储过程.触发器主要是通过事件进行触发而被执行的,触发器的触发事件分可为3类,分别是DML事件.DDL事件和数据库事件,而存储过程可以通过存储过程名字而被直接调 ...

  5. Oracle数据库 触发器

    文章目录 一.触发器的定义 二.触发器的分类 三.触发器的功能 四.触发器的语法 五.触发器的使用案例 案例1:向emp1表中插入一条数据后输出 欢迎加入 语句 案例2:数据校验,在周四这一天不允许向 ...

  6. oracle数据库触发器怎么查询后插入,[求助][Oracle][ORA-00604][ORA-02067]触发器被触发时向远程数据库插入数据...

    环境: 数据库:Oracle 12c:数据库A(本地),数据库B(远程),在A中创建DBLink连接到B 工具:sqldevloper 问题: 数据库A中的Change表中创建了触发器T,After ...

  7. oracle数据库触发器删除不,Oracle之后删除触发器

    本Oracle教程解释了如何在Oracle中创建Before Delete触发器的语法和示例. Before Delete触发器表示Oracle将在执行删除操作之前触发此触发器. 语法 在Oracle ...

  8. oracle数据库有触发器,Oracle数据库触发器(Triggers)

    触发器是一种自动执行响应数据库变化的程序.可以设置为在触发器事件之前或之后触发或执行.能够触发触发器事件的事件包括下面几种: DML事件 DDL事件 数据库事件 DML事件触发器可以是语句或行级触发器 ...

  9. oracle中触发器的语法,解析Oracle触发器的语法

    导读:触发器是一种特殊的存储过程,触发器的执行不是由程序调用,也不是手工启动,而是由事件来触发,Oracle数据库是大家非常熟悉的数据库系统啦,那么Oracle触发器的语法是怎样的呢?下文中将为大家带 ...

最新文章

  1. 利用浏览器LocalStorage缓存图片,视频文件
  2. JZOJ 1422. 猴子摘桃
  3. 令牌桶限流之redis-cell的安装,使用,详解
  4. oracle日志文件大小规则,在线重做Oracle日志文件大小
  5. LeetCode 404. 左叶子之和(递归)
  6. GAN —— 《Generative Adversarial Nets》
  7. 平均每个员工2000万!苹果为啥买下这家刚成立3年的AI创业公司?
  8. atime、ctime 和 mtime区别
  9. 程序员摆脱疲劳的 11 个建议
  10. 在线2-36进制转文本工具
  11. maximum call stack size exceeded ajax,Maximum call stack size exceeded error
  12. mysql备份的 三种方式
  13. linux扫描后门工具,Linux下rootkit后门检测工具chkrootkit安装使用教程
  14. Acad多窗体并排展现
  15. php直播平台原理,php直播平台源码的直播带货平台有何技巧,别说没告诉你
  16. 2016最新淘宝客申请高佣金以及分析抓包详情
  17. 自适应QP(Adaptive QP)
  18. docker rabbit Management API returned status code 500 -
  19. 第4章 Spring的IoC容器之BeanFactory(四)
  20. 论创业者的幸存者偏差

热门文章

  1. C++多线程快速入门(一):基本常用操作
  2. treeset java_Java TreeSet pollLast()方法与示例
  3. setlenient_Java日历setLenient()方法与示例
  4. oracle中的with的用法,oracle中with子句的用法(转)
  5. ffmpeg-从mp4、flv、ts文件中提取264视频流数据
  6. C和汇编混合编程---栈平衡
  7. Rabbits —— HDU-6227
  8. 解决QTreeWidget中item无法整行同时显示相同颜色
  9. Effective C++学习第三天
  10. 【Linux系统编程学习】信号、信号集以其相关函数