资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
触发器的原理和应用触发器的原理和应用触发器是大型关系数据库都会提供的一项技术,触发器通常用来完成有数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。触发器的基本原理触发器类似于过程、函数,其包括声明部分、异常处理部分,并且都有名称、都被存储在数据库中。但与普通的过程、函数不同的是,函数需要用户显式的调用才执行,而触发器则是当某些事件发生时由 Oracle 自动执行,触发器的执行对用户来说是透明的。1、触发器类型触发器的类型包括如下三种:(1) 、DML 触发器:对表或视图执行 DML 操作时触发。(2) 、INSTEAD OF 触发器:只定义在视图上,用来替换实际的操作语句。(3) 、系统触发器:对数据库系统进行操作(如 DDL 语句、启动或关闭数据库等系统事件)时触发。2、相关概念(1)触发事件引起触发器被触发的事件。如 DML 语句(如INSERT、UPDATE、DELETE 语句对表或视图执行数据处理操作) 、DDL语句(如 CREATE、ALTER、DROP 语句在数据库中创建、修改、删除模式对象) 、数据库系统事件(如系统启动或退出、异常错误) 、用户事件(如登录或退出数据库) 。(2) 、触发条件触发条件是有 WHEN 子句指定的一个逻辑表达式。只有当该表达式的值为 TRUE 时,遇到触发事件才会自动执行触发器,使其执行触发操作,否则 即便遇到触发事件也不会执行触发器。(3) 、触发对象触发对象包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。(4) 、触发操作触发器所要执行的 PL/SQL 程序,即执行部分。(5) 、触发时机触发时机指定触发的触发时间。如果指定为 BEFRE,则表示在执行 DML 操作之前触发,以便防止某些错误操作发生或实现某些业务规则;如果指定为 ALTE,则表示在 DML 操作之后会触发,以便记录该操作或做某些事后处理。(6) 、条件谓词当在触发器中包含了多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用 Oracle 提供的如下条件谓词。INSETING:当触发事件是 INSERT 时,取值为 TRUE,否则为 FALSE。UPDATING(column_1,column_2,.,column_n);当触发事件是 UPDATE 时,如果修改了 column_x 列,则取值为 TRUE,否则为 FALSE ,其中 column_x 是可选的。DELETING:当触发事件是 DELETE 时,取值为 TRUE,否则为 FALSE。(7)、触发子类型触发子类型分别为行触发(row)和语句触发(statement),行触发即对每一行操作时都要触发,而语句触发只对这种操作触发一次。一般进行 SQL 语句操作时都应是行触发,只有对整个表作安全检查(即防止非法操作)时才用触发。如果省略此项,默认为语句触发。此外触发器中还有两个相关值,分别对应被触发的行中的旧表值和新表值,用 old 和 new 来表示。创建触发器创建触发器的语句是 CREATE TRGGER,其语法格式如下:CREATE OR REPLACE TRIGGER触发条件触发体例子:创建触发器 my_triggerCREATE TRIGGER my_trigger -定义一个触发器 my_triggerBEFORE INSERT or UPDATE of TID,TNAME on TEACHERSFOR each rowWHEN(new.TNAME=David) -这一部分是触发条件DECLARE -下面这一部分是触发体teacher_id TEACHERS.TID%TYPE;INSERT_EXIST_TEACHER EXCEPTION;BEGINSELECT TID INTO teacher_idFROM TEACHERSWHERE TNAME=new.TNAME;RAISE INSERT_EXIST_TEACHER;EXCEPTION -异常处理也可以用在这里WHEN INSRT_EXIST_TEACHER THENINSRT INTO ERROR(TID,ERR)VALUES(teacher_id,the teacher already exists!);END my_trigger;执行触发器当某些事件发生时,由 Oracle 自动执行触发器。对一张表上的触发器最好加以限制,否则会因为触发器过多而加重负载,影响性能。另外,最好将一张表的触发事件编写在一个触发体重,这也可以大大改善性能。例子:把于表 TEACHERS 有关的所有触发事件都放在触发器my_trigger1 中。CREATE TRIGGER my_trigger1AFTER INSERT or UPDATE or DELETE on TEACHERSFOR each row;DECLAREinfo CHAR(10);BEGINIF inserting THEN -如果进行插入操作info:=INSERT;ELSIF updating THEN -如果进行修改操作info:=Update;ELSEinfo:=Delete;END IF;INSERT INTO SQL_INFO VALUES(info); -记录这次操作信息END my_trigger1;删除触发器当一个触发器不在使用时,要从内存中删除它,例如:DROP TRIGGER my_trigger;当一个触发器已经过时,想重新定义时,不必先删除再创建,同样只需在 CREATE 语句后面加上 OR REPLACE 关键字即可。如:CREATE OR REPLACE TRIGGER my_trigger;
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号