ORACLE数据库触发器【转载】

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

时间: 2024-10-27 19:36:36

ORACLE数据库触发器【转载】的相关文章

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

一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数据库后才能向该表中执行DML操作.(第1题中,user是系统函数,返回当前用户.字符串中使用两个单引号表示一个单引号.) 要求:分别以system用户和scott用户对emp 表执行DML操作,试验触发器的运行效果. (1)在scott用户下创建触发器 语句: create or replace t

Oracle中触发器(1)

Oracle数据库触发器是存储于数据库的命名PL/SQL语句块,当触发事件发生时他们会隐含的执行,执行触发器的活动被称为触发触发器. 特定用户在特定模式下,或者任何用户执行的ddl语句(如create或者alter),这种触发器经常被用于审计目的,并且专用于oracle DBA.可以记录各种模式修改,何时执行.以及那个用户执行的. 系统事件,如数据库启动或者关闭 用户事件,如登录或者注销.即可以定义一个触发器,在用户登录数据库时记录用户名和登录时间. 触发器相关视图: 创建触发器的通用语法: c

【转载:Oracle基础知识】Oracle数据库体系结构

先来看张直观的图:                                            oracle 11g 体系结构图 理解Oracle体系结构要充分理解三个概念:数据库(database),数据库实例(instance),会话(session),一定不要把这三个概念弄混. 数据库的概念 (A)    物理存储结构由数据文件.控制文件.重做日志文件组成: 1.       数据文件(datafile) select * from dba_data_files; 数据文件包括存

JAVA通过JDBC连接Oracle数据库详解【转载】

JAVA通过JDBC连接Oracle数据库详解 (2011-03-15 00:10:03) 转载▼http://blog.sina.com.cn/s/blog_61da86dd0100q27w.html Java连接Oracle步骤: 1.注册加载驱动 驱动名:DRIVER="oracle.jdbc.driver.OracleDriver"; Class.forName("驱动类名"); 2.获得连接 数据库地址: URL="jdbc:oracle:thi

Oracle数据库PL/SQL存储过程游标触发器

创建一个添加FOOD的存储过程 create or replace procedure add_food_pro (name in varchar,price in number,description in varchar) as  begin insert into food (f_name,f_price,description)values(name,price,description); commit; end; --下面的代码是调用存储过程 begin add_food_pro('糖

Oracle实例和Oracle数据库(Oracle体系结构)---转载

对于初接触Oracle 数据库的人来讲,很容易混淆的两个概念即是Oracle 实例和Oracle 数据库.这两 概念不同于SQL sever下的实例与数据库,当然也有些相似之处.只是在SQL server我们根本不需要花费太 多的精力去搞清SQL实例和数据库,因为它简单易于理解.下面简要说明一下SQL实例.数据库,更多的是讲 述Oracle下的实例及数据库. 一.SQL server中的实例与数据库 1.SQL中的实例指的是一个SQL server服务器上仅有一个缺省实例.缺省实例名即为机器名S

【转载】Oracle实例和Oracle数据库(Oracle体系结构)

免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/leshami/article/details/5529239 --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --======================================

Oracle数据库之PL/SQL触发器

1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作(insert,delete,update)时就会激活它执行.触发器经常用于加强数据的完整性约束和业务规则等. ORACLE触发器有三种类型,分别是:DML触发器.替代触发器和系统触发器. DML触发器 顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT.UPDATE.D

Oracle数据库用户名密码【转载自百度经验】

登录到安装oracle数据库服务器的操作系统.打开命令窗口:(我的演示机器是windows)   查看环境变量ORACLE_SID的设置情况: windows: echo %ORACLE_SID% linux: echo $ORACLE_SID   设置环境变量ORACLE_SID的值为你想登录的oracle实例的SID: set ORACLE_SID=orcl   键入命令:sqlplus / as sysdba 就可以以sysdba的身份登录到oracle了! linux系统下,如果找不到s