使用数据库触发器.ppt
《使用数据库触发器.ppt》由会员分享,可在线阅读,更多相关《使用数据库触发器.ppt(45页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、CISSST授课教师授课教师:原炜斌原炜斌QQQQ:448920091448920091使用数据库触发器Oracle10g数据库管理课程CISSST目标(Objectives):触发器种类与定义只读视图、可更新视图Instead-Of触发器新的数据库触发器使用数据库触发器Oracle10g数据库管理课程CISSST数据库触发器是存储在数据库中、根据发生的事件而执行的一种存储子程序。它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。该事件可以是一个DDL操作,如对象的创建、修改或
2、删除;也可以是一个DML操作,如表或视图上的一个INSERT、UPDATE或DELETE操作;也可以是系统事件,如数据库启动和关闭、登录和登出;还可以是一个用户事件,如模式登录和登出。数据库触发器使您能够执行多种函数。概述使用数据库触发器Oracle10g数据库管理课程CISSST概述使用数据库触发器商品商品ID库存数量库存数量库存预警量库存预警量1004500101157761011584810入库流水号入库流水号入库商品入库商品ID入库数量入库数量2006120058115870200612006011581102006120083100440出库流水号出库流水号出库商品出库商品ID出库数
3、量出库数量200612005811573020061200601158602006120083100455库存表库存表GOODS商品出库表商品出库表OUTGOODS商品入库表商品入库表INGOODS每天有商品的入库和出库,每天有商品的入库和出库,如何确定商品的库存量?如何确定商品的库存量?Oracle10g数据库管理课程CISSST概述使用数据库触发器由于入库操作或者出库操作都可能影响到商品的库存量,所以可以考虑在入库表或者出库表增加一个触发器,当对入库表或者出库表做DML操作(INSERT、UPDATE、DELETE)操作时,都会激活入库表或者出库表上的触发器,进而通过触发器中的逻辑修改库存
4、表中的库存量。要完整实现这一过程,需要理解两个概念:1、数据库中的事务处理2、JAVA JDBC调用过程Oracle10g数据库管理课程CISSST最常见的数据库触发器用法是:为DDL和DML操作进行审计为强制执行复杂验证规则,防止错误的或不一致的数据输入到数据库中。当特定行为发生时,执行与其相关的行为。强制执行复杂的数据完整性关系。在某些情况下,如父记录更新以后子记录上要执行级联更新操作等。如果不使用数据库触发器,将无法公开的指定这种完整新的约束关系。自动生成派生值。处理系统事件。概述使用数据库触发器Oracle10g数据库管理课程CISSST数据库触发器是一种响应数据库事件而执行的存储过程
5、。该事件被称为触发器事件,它可以为下面任意一个事件:DML操作一个系统事件,如数据库STARTUP、SHUTDOWN、SERVERERROR一个用户事件,如LOGON、LOGOFF触发器事件是在执行触发器语句时进行初始化的。触发器事件在数据库启动与关闭或者用户登录与登出时也能进行初始化。PL/SQL触发器:种类与定义Oracle10g数据库管理课程CISSST触发器的种类触发器的种类:DMLINSTEAD-OF系统和用户事件触发器Oracle10g数据库管理课程CISSST触发器的组成触发事件:即在何种情况下触发TRIGGER;例如:INSERT,UPDATE,DELETE。触发时间:即该TR
6、IGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。触发器本身:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。例如:PL/SQL 块。触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。Oracle10g数据库管理课程CISSST例子:触发器的定义CREATEORREPLA
7、CETRIGGERtrigger_nameBEFORE|AFTERtrigger_eventONtable_referenceFOREACHROWWHENtrigger_conditiontrigger_body;Oracle10g数据库管理课程CISSST定义DML触发器CREATE OR REPLACE TRIGGER ai_org_trigAFTER INSERT ON org_tabFOR EACH ROWBEGIN UPDATE sec_hrc_audit SET num_rows=num_rows+1 WHERE hrc_code=:NEW.hrc_code;IF(SQL%NOTF
8、OUND)THEN INSERT INTO sec_hrc_audit VALUES(:NEW.hrc_code,1);END IF;END;触发器事件触发器主体Oracle10g数据库管理课程CISSST触发器的任何部分都不能接受参数,但是它可以包含一个可选的声明部分和异常处理部分。BEGINEND部分可以包含SQL和PL/SQL语句,和对PL/SQL过程和函数的调用。触发器的主体可以是一个单独的调用PL/SQL过程或函数的CALL语句,或在PL/SQL中发布的Java存储过程。触发器的定义Oracle10g数据库管理课程CISSST有两种类型的DML触发器:ROW级触发器STATEMENT
9、级触发器ROW级触发器和STATEMENT级触发器Oracle10g数据库管理课程CISSSTROW级触发器和STATEMENT级触发器ROW级触发器级触发器STATEMENT触发器触发器触发器语句每影响一行就点火一次只为触发器语句点火一次如果触发器事件没有影响到行,就不点火哪怕触发器事件没有影响到任何记录,也会点火可以指定BEFORE和AFTER可以指定BEFORE和AFTER触发器主体可以访问行数据触发器主体不可以访问行数据正受触发事件的影响正受触发事件的影响AFTERROW触发器锁定行数据不锁定行Oracle10g数据库管理课程CISSST该子句定义的是正在被触发事件修改的数据是怎样在触
10、发器的内部使用的。默认时,在ROW级触发器中,正被修改的数据在触发器内部是可用的,可以通过两种相关标识(:NEW和:OLD)进行引用。这些相关的标识把当前行的数据保存为一个类型为table_name%ROWTYPE的记录,其中table_name是定义了DML触发器的数据库表的名称。在触发器内部引用NEW和OLD应该使用冒号(:)。只能对ROW级触发器使用REFERENING子句。如果在STATEMENT级触发器中使用了REFERENING子句,将会产生编译错误。REFERENCING子句Oracle10g数据库管理课程CISSST:NEW和:OLD的值对于INSERT、UPDATE和DELE
11、TE触发事件来说是不同的。在INSERT语句中,只定义:NEW。对于UPDATE,:NEW和:OLD都是可用的。在DELETE中,只定义了:OLD。REFERENCING子句Oracle10g数据库管理课程CISSSTWHEN子句定义所有要为触发器主体执行而定义的WHERE条件。该WHERE条件适用于正被触发事件影响的行。如果该条件的一行的值为TRUE,触发器主体就会执行。WHEN子句后紧接着FOREACHROW子句。在WHEN子句中引用OLD和NEW时,没有使用冒号(:)。WHEN子句Oracle10g数据库管理课程CISSST判断insert操作INSERTING判断update操作UPD
12、ATEING判断delete操作DELETEING判断DML操作Oracle10g数据库管理课程CISSSTINSTEAD OF触发器是Oracle用来替换所使用的实际语句而执行的触发器。Instead ofInstead of触发器执行时,激发它的触发器执行时,激发它的DMLDML语句不执行。语句不执行。Instead ofInstead of触发器是行级触发器。触发器是行级触发器。为什么要使用为什么要使用INSTEAD OFINSTEAD OF触发器?触发器?INSTEADOF触发器Oracle10g数据库管理课程CISSST1、更新视图时2、修改对象视图、嵌套表,以及其他使用了DISTI
13、NCT、GROUPBY、CONNECTBY、STARTWITH、以及COUNT()和SUM()这样的聚合函数的视图。INSTEADOF触发器Oracle10g数据库管理课程CISSST实例讲解:建立一个emp表的副本:empcopy,建立一个dept表的副本deptcopyINSTEADOF触发器create table empcopy asselect*from emp;create table deptcopy asselect*from dept;alter table deptcopyadd(mgrno number(4),depttype number(4);Oracle10g数据库
14、管理课程CISSST实例讲解:INSTEADOF触发器update deptcopy set mgrno=7539 where deptno=10;update deptcopy set mgrno=7566 where deptno=20;update deptcopy 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
15、10g数据库管理课程CISSST实例讲解:INSTEADOF触发器 create or replace view mgr_info as select e.ename,d.dname,d.loc from empcopy e,deptcopy d where e.empno=d.mgrno;-testing-insert into mgr_info(ename,dname,loc)values(CLARK,SALES,DALLAS);直接插值会报错!需要建立触发器!直接插值会报错!需要建立触发器!Oracle10g数据库管理课程CISSST实例讲解:INSTEADOF触发器 create or
16、 replace trigger mgrinfoinsert instead of insert on mgr_info declare v_empno empcopy.empno%type;begin select empno into v_empno from empcopy where ename=:new.ename;update deptcopy set mgrno=v_empno where dname=:new.dname and loc=:new.loc;end;Oracle10g数据库管理课程CISSSTDML触发器都是在DML事件上被激活,而系统触发器可以在两种不同的系统事
17、件上被激活(DDL事件和数据库事件)。DDL事件包括:Create、Alter、Drop 等数据库事件包括:服务器的启动或者关闭,用户的登录或者退出等,以及服务器的错误等。创建系统触发器create or replace trigger trigger_namebefore|afterddl_event_list|database_event_liston database|on schemawhen clausetrigger_body;Oracle10g数据库管理课程CISSST创建系统触发器事件事件允许时机允许时机说说 明明启动启动之后之后实例启动时激发实例启动时激发关闭关闭之前之前实例
18、关闭时激发,如果数据库异常关闭,则该事件也许不会激发。实例关闭时激发,如果数据库异常关闭,则该事件也许不会激发。服务器错误服务器错误之后之后只要错误发生就激发只要错误发生就激发登录登录之后之后在用户成功链接数据库后激发在用户成功链接数据库后激发注销注销之前之前在用户注销开始时激发在用户注销开始时激发创建创建之前,之后之前,之后在创建模式对象之前或之后激发在创建模式对象之前或之后激发删除删除之前,之后之前,之后在撤销模式对象之前或之后激发在撤销模式对象之前或之后激发更改更改之前,之后之前,之后在更改模式对象之前或之后激发在更改模式对象之前或之后激发Oracle10g数据库管理课程CISSST1、
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 使用 数据库 触发器
限制150内