ORACLE触发器其实是PL/SQL块,它类似于存储过程和函数,不过有一点不同的是,触发器是隐式调用的,并不能接收参数. ORACLE触发器有三种类型,分别是:DML触发器, 替代触发器和系统触发器. 下面对这三种类型一一进行讲述
1.DML触发器
顾名思义,DML触发器是由DML语句触发的.例如数据库的INSERT/UPDATE/DELETE操作都可以触发该类型的触发器. 它们可以在这些语句之前或之后触发,或者在行级上触发(就是说对于每个受影响的行都触发一次)
例如我们有一张表TABLE1 ,总共有三个字段ID,姓名,年龄 ,当我们在插入时希望ID可以自动生成,那么可以建立一个触发器
CREATEORREPLACETRIGGERTR_INSERT_ID

BEFOREINSERTONTABLE1

BEGIN

SELECTT.NEXTVALINTO:NEW.IDFROMDUAL;

END;
那么当我们插入该表的时候,ID字段会自动填充.
2.替代触发器
替代触发器只能使用在视图上,与DML不同的是,DML触发器是运行在DML之外的,而替代触发器是代替激发它的DML语句运行.替代触发器是行级,举个例子,这里有个视图:
--例子来源insteadOf.sql
CREATEORREPLACEVIEWclasses_roomsAS
SELECTdepartment,course,building,room_numbe
FROMrooms,classes
WHERErooms.room_id=classes.room_id;
直接对视图进行插入操作非法的.因为插入操作要求对两个表都进行修改,例如
--例子来源insteadOf.sql
如果使用替代
INSERTINTOclasses_rooms(department,course,building,
room_number)
2VALUES('MUS',100,'MusicBuilding',200);
INSERTINTOclasses_rooms(department,course,building,room_number)
*
ERRORatline1:
ORA-01732:datamanipulationoperationnotlegalonthisview
触发器,那么就可以解决这个问题:
CREATETRIGGERClassesRoomsInsert
INSTEADOFINSERTONclasses_rooms
DECLARE
v_roomIDrooms.room_id%TYPE;
BEGIN
--FirstdeterminetheroomID
SELECTroom_id
INTOv_roomID
FROMrooms
WHEREbuilding=:new.building
ANDroom_number=:new.room_number;
--Andnowupdatetheclass
UPDATECLASSES
SETroom_id=v_roomID
WHEREdepartment=:new.department
ANDcourse=:new.course;
ENDClassesRoomsInsert;
该触发器就可以正常工作了
3.系统触发器
这种触发器是发生在如数据库启动或关闭等系统事件时,不是在执行DML语句时发生,当然也可以在DDL时触发.
不管是以上三种的哪一种,创建的语法都是一致的.
CREATE[ORREPLACE]TRIGGERtrigger_name

...{BEFORE|AFTER|INSTEADOF}triggering_event
referencing_clause
[WHENtrigger_condition]
[FOREACHROW]
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
分享到:
相关推荐
### Oracle数据库触发器实例解析 #### 一、触发器简介 在Oracle数据库中,触发器是一种存储过程,它被设计为当特定事件(如数据插入、更新或删除)发生时自动执行。触发器可以用于执行复杂的业务逻辑或者数据完整...
通过了解和熟练掌握Oracle数据库触发器,开发者可以构建更加灵活且具有弹性的数据库应用,实现对数据变更的精细控制和自动化处理。然而,重要的是要平衡触发器的使用与性能、可维护性和设计清晰度之间的关系,以确保...
其中,系统触发器是Oracle提供的一种强大工具,能够帮助管理员监控并干预特定的数据库操作,有效防止误操作导致的数据丢失。 #### 问题描述 当DBA或其他用户具有足够的权限时,可能会因为输入错误等原因执行`DROP ...
【Oracle触发器的创建与使用】是数据库管理中不可或缺的一部分,尤其在Oracle数据库系统中,触发器扮演着关键角色。触发器是一种存储过程,当特定的数据库事件发生时(如INSERT、UPDATE或DELETE操作),它会被自动...
在Oracle数据库中,触发器是一种特殊类型的存储过程,它会在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。在这个场景中,我们关注的是一个特定的触发器,它在插入数据后被调用,并通过存储过程来...
Oracle数据库触发器是数据库管理系统中的一种重要特性,它允许开发者在特定的数据操作(如INSERT、UPDATE、DELETE)之前或之后执行自定义的SQL代码或PL/SQL块。这些代码可以用来实现业务规则、数据验证、审计跟踪等...
Oracle数据库触发器是指在特定的事件发生时自动执行的一组代码,用于保持数据的一致性和完整性。触发器可以用于实现数据的验证、计算和转换等功能。 9. Oracle数据库视图: Oracle数据库视图是指根据一个或多个基本...
Oracle触发器是一种特殊的存储过程,它可以在数据库中自动执行一些操作,主要用于实现数据的完整性、数据的安全性和业务逻辑的实现。触发器可以分为四种类型:DML触发器、DDL触发器、替代触发器和数据库事件触发器。...
### mssql数据库与oracle数据库通过触发器实现数据表同步 #### 概述 在实际的企业应用环境中,常常需要实现不同数据库平台之间的数据同步。本文档将详细介绍如何利用触发器技术来实现在Microsoft SQL Server(简称...
"查看登录 Oracle 数据库用户记录" Oracle 数据库是一个强大的关系型数据库管理系统,提供了强大...本文介绍了如何使用触发器来查看登录 Oracle 数据库用户记录,帮助数据库管理员更好地管理和监控数据库的访问情况。
在Oracle数据库中,触发器(Triggers)是一种存储过程,它们自动执行,当特定的数据库事件发生时,如INSERT、UPDATE或DELETE操作。调试Oracle触发器是开发和维护数据库应用程序时的重要步骤,可以帮助我们找出潜在的...
【大型数据库触发器介绍】 数据库触发器是数据库管理系统中的一种特殊程序,它在特定的事件(如INSERT、UPDATE或DELETE操作)发生时自动执行,用于实现业务规则或复杂的数据约束。在ORACLE和SYBASE这样的大型数据库...
此外,为了便于读者进一步学习和拓展知识,还列举了一些推荐的阅读材料,如Oracle官方文档、专业书籍等,这些都是提高Oracle数据库触发器应用水平的重要资源。 总之,通过本练习文档的学习,数据库开发者可以系统地...
2. 提供oracle数据库dba日常管理方法。 3. 掌握oracle数据库体系机构,为oracle优化奠定基础。 三、适合人群: 1.有意从事oracle 数据库工作,担任dba角色的人员; 2. Oracle数据库设计、开发和备份等管理人员; ...
这通常涉及到数据库触发器、存储过程以及Java编程的结合使用。以下是对这个主题的详细解释: 1. **Oracle触发器**: - 触发器是Oracle数据库中的一个数据库对象,它在特定的数据库操作(如INSERT、UPDATE或DELETE...
Oracle DML 触发器在数据库编程中的应用 Oracle DML 触发器是关系型数据库系统中的一个重要组件,能够自动执行特定的操作,以响应数据库中的变化。本文将对 Oracle DML 触发器的工作原理、类型、使用方法等进行详细...
Oracle数据库触发器是数据库管理系统中一种特殊类型的存储程序,它会在满足特定条件时自动执行。Oracle触发器可以响应数据表的DML(数据操纵语言)事件,如INSERT、UPDATE或DELETE,也可以响应DDL(数据定义语言)...
Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,它在企业级数据管理和应用程序开发中扮演着核心角色。本资源“Oracle数据库系统应用与开发”深入探讨了Oracle数据库的使用和开发技术,特别关注...