Oracle9i第8章 触发器

上传人:飞*** 文档编号:5500367 上传时间:2017-08-07 格式:PPT 页数:28 大小:544.50KB
返回 下载 相关 举报
Oracle9i第8章 触发器_第1页
第1页 / 共28页
Oracle9i第8章 触发器_第2页
第2页 / 共28页
Oracle9i第8章 触发器_第3页
第3页 / 共28页
Oracle9i第8章 触发器_第4页
第4页 / 共28页
Oracle9i第8章 触发器_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《Oracle9i第8章 触发器》由会员分享,可在线阅读,更多相关《Oracle9i第8章 触发器(28页珍藏版)》请在金锄头文库上搜索。

1、第七章 触发器,触发器是存储在数据库中的PL/SQL块。并且在数据库对表发出数据库操作行为(update、insert和delete)时被执行。一个触发器由三部分组成:触发事件或语句、触发限制和触发器动作。触发事件或语句是指引起激发触发器的SQL语句,可为对一指定表的INSERT、UNPDATE或DELETE语句。触发限制是指定一个布尔表达式,当触发器激发时该布尔表达式是必须为真。 每张基表最多可建立12个触发器。,触发器的执行可以定义在语句执行前或语句执行后。在语句执行前执行的触发器称为先触发器(BEFORE TRIGGER),反之,称为后触发器(AFTER TRIGGER)。先触发器允许在

2、事件发生前采取行动。例如,可以使用先删除的触发器去检查这个删除操作是否允许执行。如果该触发器检查的结果不允许进行删除,那么该语句便无效了。通常,在保证事务规则、保证参照完整性时使用先触发器。而当用户仅仅想记录表中数据发生的改动时使用后触发器。,可以创建被如下语句所触发的触发器:DML语句(DELETE,INSERT,UPDATE);DDL语句(CREATE,ALTER, DROP);数据库事件(SERVERERROR,LOGON,LOGOFF,STARTUP,SHUTDOWN)。,触发器可以创建在下列对象上:数据库表数据库视图数据库实例用户模式,触发器的类型有3种:(1)DML触发器。(2)替

3、代触发器。Oracle不能直接对有两个以上的表建立的视图进行操作,所以给出了替代触发器。(3)系统触发器。可以在oracle数据库系统操作时间进行触发,如数据库的打开和关闭等。,DML触发器是作用在数据库上的由DML语句事件触发的触发器,创建DML触发器的语法为:CREATE OR REPLACE TRIGGER SCHEMA.trigger_nameBEFORE|AFTER INSERT|DELETE|UPDATE OF col_list ON SCHEMA.table_nameFOR EACH ROW DECLAREBEGINEND;,创建触发器的限制,(1)代码大小。必须小于32kb。(

4、2)可以不用DML语句,不能包括DDL语句。Rollback、commit、savepoint也不能使用。但对于系统触发器可以使用create、alter、drop table和alter compile语句。(3)Long、long raw和lob的限制:a.不能插入数据到long或long raw。b.来自long或long raw的数据可以转换成字符型。c.使用long或long raw不能声明变量。d.在long或long raw列中不能使用“:new”和“:parent”。e.Lob中的“:new”变量不能修改。(4)引用包变量限制。如update或delete检测到当前的updat

5、e冲突,则oracle执行rollback到savepoint上并重新启动更新,可能需要多次才能成功。,触发器触发次序,Oracle对事件的触发有16种类型,按照一定次序执行:(1)执行before语句的触发器;(2)对于受语句影响的每一行执行操作:执行before语句行级触发器-执行DML语句-执行AFTER行级触发器;(3)执行after语句触发器。,触发器和过程名和包的名字不一样,它有单独的名字空间,因而触发器名可以和表名或过程名同名,但在同一个schema中的触发器名不能相同。,当任何时候某个部门从dept表中删除时,该触发器将从emp表中删除该部门的所有雇员。CREATE OR RE

6、PLACE TRIGGER del_emp_deptnoBEFORE DELETE ON deptFOR EACH ROWBEGINDELETE FROM emp WHERE deptno=:OLD.deptno;END;,系统触发器在数据库启动或关闭等系统事件时激发,而不是在执行DML在语句时激发。创建系统触发器要有ADMINISTRER DATABASE TRIGGER权限。系统触发器可以分为两种,数据库级触发器和用户级触发器。,一个数据库级的触发器意味着触发的事件超出了用户的范围,将适用于所有的用户。数据库级触发器可以由下列事件触发:SHUTDOWN:数据库关闭STARTUP:启动数据库

7、LOGON:登录数据库LOGOFF:退出数据库SERVERERROR:发生数据库服务错误虽然以上事件编写的触发器既可以是先触发器类型,也可以是后触发器类型。但如果使用先触发器类型的启动触发器将会出现很糟糕的情况,因为数据库必须在该先触发程序执行前运行。,这个例子是建立在SERVERERROR事件上的触发器,用于跟踪数据库中发生的错误。首先创建用于记录错误的表log_db_error。CREATE TABLE log_db_error(errtime DATE,username VARCHAR2(30),instance NUMBER,dbnameVARCHAR2(50),errstack VA

8、RCHAR2(2000);,然后创建触发器,在发生数据库错误时触发,将错误信息写入log_db_error表中。CREATE OR REPLACE TRIGGER tri_logdberrorAFTER SERVERERROR ON DATABASEBEGININSERT INTO log_db_errorVALUES(sysdate, SYS.LOGIN_USER, SYS.INSTANCE_NUM, SYS.DATABASE_NAME, DBMS_UTILITY.FORMAT_ERROR_STACK);END;/,DBMS_UTILITY.FORMAT_ERROR_STACK是一个存储过程

9、,返回与错误相关的信息。最后,用户可以生成几个错误来测试一下。,用户级触发器也叫DDL触发器,是创建在当前用户模式上的触发器,只能被当前的这个用户触发。用户级触发器主要针对于对用户对象有影响的CREATE、ALTER或DROP语句。创建系统触发器的语法为:CREATE OR REPLACE TRIGGER SCHEMA.trigger_nameBEFORE|AFTERddl_event_list|database_event_list ON DATABASE|schema.SCHEMADECLAREBEGINEND;,建立一个DDL触发器,阻止某人对SCOTT用户所有的对象进行误删除。CREA

10、TE OR REPLACE TRIGGER no_drop_objBEFORE DROP ON SCOTT.SCHEMABEGINraise_application_error(-20000, Cant drop objects owned by SYSTEM.);END;/,删除触发器的语句格式为:DROP TRIGGER tri_name;,关闭触发器的语句格式为:ALTER TRIGGER tri_name DISABLE;激活触发器的语句格式为:ALTER TRIGGER tri_name ENABLE;,创建替代触发器,Instead_of用于对视图的DML触发。视图可能由多个表关联

11、而成,因而并非所有的关联都是可更新的。例,在xscj数据库中创建视图和触发器。create or replace view cs_kc_avgasselect xh,avg(cj) as avg_cjfrom xs_kcgroup by xh;,create trigger cs_kc_avg_delinstead of delete on cs_kc_avg for each rowBegindelete from xs_kc where xh=:old.xh;End cs_kc_avg_del;,利用OEM创建触发器,小结,本章介绍了三种典型的触发器:DML触发器、数据库级触发器和用户级触发器。DML触发器是为了应答对表执行的INSERT、UPDATET和DELETE操作;数据库级触发器是用来应答诸如数据库启动、关闭和数据错误等数据库事件的;用户级触发器是用来应答CREATE、ALTER和DROP语句的。,

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

当前位置:首页 > 中学教育 > 其它中学文档

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