使用数据库触发器

上传人:shaoy****1971 文档编号:115144113 上传时间:2019-11-12 格式:PPT 页数:45 大小:375.81KB
返回 下载 相关 举报
使用数据库触发器_第1页
第1页 / 共45页
使用数据库触发器_第2页
第2页 / 共45页
使用数据库触发器_第3页
第3页 / 共45页
使用数据库触发器_第4页
第4页 / 共45页
使用数据库触发器_第5页
第5页 / 共45页
点击查看更多>>
资源描述

《使用数据库触发器》由会员分享,可在线阅读,更多相关《使用数据库触发器(45页珍藏版)》请在金锄头文库上搜索。

1、Oracle 10g数据库管理课程,授课教师: 原炜斌 QQ:448920091,使用数据库触发器,Oracle 10g数据库管理课程,目标(Objectives): 触发器种类与定义 只读视图、可更新视图 Instead-Of触发器 新的数据库触发器,使用数据库触发器,Oracle 10g数据库管理课程,数据库触发器是存储在数据库中、根据发生的事件而执行的一种存储子程序。它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。该事件可以是一个DDL操作,如对象的创建、修改或删除;也

2、可以是一个DML操作,如表或视图上的一个INSERT、UPDATE或DELETE操作;也可以是系统事件,如数据库启动和关闭、登录和登出;还可以是一个用户事件,如模式登录和登出。 数据库触发器使您能够执行多种函数。,概述,使用数据库触发器,Oracle 10g数据库管理课程,概述,使用数据库触发器,库存表GOODS,商品出库表OUTGOODS,商品入库表INGOODS,每天有商品的入库和出库, 如何确定商品的库存量?,Oracle 10g数据库管理课程,概述,使用数据库触发器,由于入库操作或者出库操作都可能影响到商品的库存量, 所以可以考虑在入库表或者出库表增加一个触发器,当对入库表 或者出库表

3、做DML操作(INSERT、UPDATE、DELETE) 操作时,都会激活入库表或者出库表上的触发器, 进而通过触发器中的逻辑修改库存表中的库存量。 要完整实现这一过程,需要理解两个概念: 1、数据库中的事务处理 2、JAVA JDBC调用过程,Oracle 10g数据库管理课程,最常见的数据库触发器用法是: 为DDL和DML操作进行审计 为强制执行复杂验证规则,防止错误的或不一致的数据输入到数据 库中。 当特定行为发生时,执行与其相关的行为。 强制执行复杂的数据完整性关系。在某些情况下,如父记录更新以 后子记录上要执行级联更新操作等。如果不使用数据库触发器,将 无法公开的指定这种完整新的约束

4、关系。 自动生成派生值。 处理系统事件。,概述,使用数据库触发器,Oracle 10g数据库管理课程,数据库触发器是一种响应数据库事件而执行的存储过程。该事件被称为触发器事件,它可以为下面任意一个事件: DML操作 一个系统事件,如数据库STARTUP、SHUTDOWN、 SERVERERROR 一个用户事件,如LOGON、LOGOFF 触发器事件是在执行触发器语句时进行初始化的。触发器事件在数据库启动与关闭或者用户登录与登出时也能进行初始化。,PL/SQL触发器:种类与定义,Oracle 10g数据库管理课程,触发器的种类,触发器的种类: DML INSTEAD-OF 系统和用户事件触发器,

5、Oracle 10g数据库管理课程,触发器的组成,触发事件:即在何种情况下触发TRIGGER; 例如:INSERT, UPDATE, DELETE。 触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。 触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如:PL/SQL 块。 触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。 语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次; 行级(R

6、OW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。,Oracle 10g数据库管理课程,例子:,触发器的定义,CREATE OR REPLACETRIGGER trigger_name BEFORE|AFTER trigger_event ON table_reference FOR EACH ROW WHEN trigger_condition trigger_body;,Oracle 10g数据库管理课程,定义DML触发器,CREATE OR REPLACE TRIGGER ai_org_trig AFTER INSERT ON org_tab FO

7、R EACH ROW BEGIN UPDATE sec_hrc_audit SET num_rows =num_rows+1 WHERE hrc_code =:NEW.hrc_code; IF (SQL%NOTFOUND) THEN INSERT INTO sec_hrc_audit VALUES (:NEW.hrc_code,1); END IF; END;,触发器事件,触发器主体,Oracle 10g数据库管理课程,触发器的任何部分都不能接受参数,但是它可以包含一个可选的声明部分和异常处理部分。BEGINEND部分可以包含SQL和PL/SQL语句,和对PL/SQL过程和函数的调用。 触发器

8、的主体可以是一个单独的调用PL/SQL过程或函数的CALL语句,或在PL/SQL中发布的Java存储过程。,触发器的定义,Oracle 10g数据库管理课程,有两种类型的DML触发器: ROW级触发器 STATEMENT级触发器,ROW级触发器和STATEMENT级触发器,Oracle 10g数据库管理课程,ROW级触发器和STATEMENT级触发器,Oracle 10g数据库管理课程,该子句定义的是正在被触发事件修改的数据是怎样在触发器的内部使用的。默认时,在ROW级触发器中,正被修改的数据在触发器内部是可用的,可以通过两种相关标识(:NEW和:OLD)进行引用。 这些相关的标识把当前行的数

9、据保存为一个类型为table_name%ROWTYPE的记录,其中table_name是定义了DML触发器的数据库表的名称。 在触发器内部引用NEW和OLD应该使用冒号(:)。 只能对ROW级触发器使用REFERENING子句。如果在STATEMENT级触发器中使用了REFERENING子句,将会产生编译错误。,REFERENCING子句,Oracle 10g数据库管理课程,:NEW和:OLD的值对于INSERT、UPDATE和DELETE触发事件来说是不同的。在INSERT语句中,只定义:NEW。对于UPDATE,:NEW和:OLD都是可用的。在DELETE中,只定义了:OLD。,REFER

10、ENCING子句,Oracle 10g数据库管理课程,WHEN子句定义所有要为触发器主体执行而定义的WHERE条件。该WHERE条件适用于正被触发事件影响的行。如果该条件的一行的值为TRUE,触发器主体就会执行。 WHEN子句后紧接着FOR EACH ROW子句。 在WHEN子句中引用OLD和NEW时,没有使用冒号(:)。,WHEN子句,Oracle 10g数据库管理课程,判断insert操作 INSERTING 判断update操作UPDATEING 判断delete操作DELETEING,判断DML操作,Oracle 10g数据库管理课程,INSTEAD OF触发器是Oracle用来替换所

11、使用的实际语句而执行的触发器。Instead of触发器执行时,激发它的DML语句不执行。Instead of触发器是行级触发器。 为什么要使用INSTEAD OF触发器?,INSTEAD OF触发器,Oracle 10g数据库管理课程,1、更新视图时 2、修改对象视图、嵌套表,以及其他使用了DISTINCT、GROUP BY、CONNECT BY、START WITH、以及COUNT()和SUM()这样的聚合函数的视图。,INSTEAD OF触发器,Oracle 10g数据库管理课程,实例讲解: 建立一个emp表的副本:empcopy,建立一个dept表的副本deptcopy,INSTEAD

12、 OF触发器,create table empcopy as select * from emp; create table deptcopy as select * from dept; alter table deptcopy add (mgrno number(4),depttype number(4);,Oracle 10g数据库管理课程,实例讲解:,INSTEAD OF触发器,update deptcopy set mgrno=7539 where deptno=10; update deptcopy set mgrno=7566 where deptno=20; update de

13、ptcopy set mgrno=7698 where deptno=30; update deptcopy set mgrno=7782 where deptno=40; create table projecttab( prjlevel number(4), projno number(4), respdept number(2) );,Oracle 10g数据库管理课程,实例讲解:,INSTEAD OF触发器,create or replace view mgr_info as select e.ename,d.dname,d.loc from empcopy e,deptcopy d

14、where e.empno=d.mgrno; - testing - insert into mgr_info(ename,dname,loc) values(CLARK,SALES,DALLAS);,直接插值会报错!需要建立触发器!,Oracle 10g数据库管理课程,实例讲解:,INSTEAD OF触发器,create or replace trigger mgrinfoinsert instead of insert on mgr_info declare v_empno empcopy.empno%type; begin select empno into v_empno from e

15、mpcopy where ename=:new.ename; update deptcopy set mgrno=v_empno where dname=:new.dname and loc=:new.loc; end;,Oracle 10g数据库管理课程,DML触发器都是在DML事件上被激活,而系统触发器可以在两种不同的系统事件上被激活(DDL事件和数据库事件)。 DDL事件包括:Create 、 Alter 、Drop 等 数据库事件包括:服务器的启动或者关闭,用户的登录或者退出等,以及服务器的错误等。,创建系统触发器,create or replace trigger trigger_n

16、ame before | after ddl_event_list | database_event_list on database | on schema when clause trigger_body;,Oracle 10g数据库管理课程,创建系统触发器,Oracle 10g数据库管理课程,1、数据库的触发器不管触发事件何时发生都将被激活;而模式触发器只有在指定的模式触发事件发生时才会激活。 2、关键字database和schema决定了系统触发器的类型。 3、如果没有关键字schema来说明模式,则触发器为默认模式。 4、系统触发器可以使用when子句来指定触发器激活条件。然而,对于每一种系统触发器所指定的条件类型有如下限制:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 职业教育

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号