Oracle触发器的分类和使用
- 格式:doc
- 大小:41.28 KB
- 文档页数:5
oracle触发器工作原理Oracle数据库中的触发器是一种存储过程,它在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行。
触发器可以用于实现数据一致性、审计、业务规则验证和复杂的数据处理逻辑。
以下是Oracle触发器工作原理的基本概述:1.定义与激活:在Oracle中,通过使用CREATE TRIGGER语句创建触发器,指定其名称、触发时机(BEFORE或AFTER)、触发事件(INSERT、UPDATE、DELETE或COMMIT等)以及作用的对象(表或视图)。
2.触发时机:BEFORE触发器会在实际操作之前执行,此时可以查看并修改将要插入、更新或删除的数据。
AFTER触发器则在实际操作完成之后执行,此时只能查看已经更改后的结果。
3.触发上下文:对于INSERT操作,触发器可以通过:NEW伪记录访问被插入的新行数据。
对于UPDATE操作,触发器同时可以获得:OLD和:NEW伪记录,分别代表更新前的老数据和更新后的新数据。
对于DELETE操作,触发器可以通过:OLD伪记录访问即将被删除的行数据。
4.执行逻辑:触发器内的PL/SQL代码会根据触发条件进行执行,可以包含任何合法的PL/SQL命令,包括对其他表的操作、控制流语句、异常处理等。
5.事务处理:触发器是事务的一部分,所以它们遵循ACID属性,并且其行为受当前事务的影响。
例如,如果事务回滚,则触发器所做的所有变更也会随之回滚。
6.实例应用:举例来说,一个AFTER INSERT触发器可能用来记录新插入数据到审计表中;而一个BEFORE UPDATE触发器可能用于检查更新的数据是否满足某些业务规则,如果不满足则阻止更新操作。
总之,Oracle触发器是数据库系统内嵌的一种自动化机制,它在特定数据库事件发生时自动执行预定义的逻辑,为确保数据完整性和业务规则得以强制执行提供了强大的支持。
oracle触发器执行顺序2010-9-13表:emp--创建包变量CREATE PACKAGE EMP_PACKAGE lSold_sum NUMBER;--存放原来薪水总额new_sum NUMBER;--存放新的薪水总额test1 number;--before upate 对应值1test2 number;--before update each row 对应值2test3 number;--after update each row 对应值3test4 number;--after update 对应值4END;注:每个触发器执行都会对应上面变量进行赋值业务规则1:给员工加薪时,要扣税,扣税的规则是,原来薪水在5000或以上的扣除总薪水的10%,小于5000的扣除总薪水的20%业务规则2:如果目前全体员工的总薪水大于或等于15000,则不能加薪了;如果总薪水小于10000,则不能减薪了。
一.不同类型触发器(行级和语句)1.before触发器--原来总薪水总额(语句)CREATE OR REPLACE TRIGGER before_update_salaryBEFORE UPDATE ON EMPbeginSELECT SUM(salary)INTO EMP_PACKAGE.old_sum FROM EMP;EMP_PACKAGE.TEST1:=1;/*RAISE_APPLICATION_ERROR(-20003,nvl(EMP_PACKAGE.test2,0));*/end;--更改每行数据(行级)CREATE OR REPLACE TRIGGER before_add_salaryBEFORE UPDATE ON EMPFOR EACH rowBEGINif:new.salary>:OLD.salary THEN --加薪if:old.salary <5000THEN:NEW.salary :=:NEW.salary*0.8;RAISE_APPLICATION_ERROR(-20004,nvl(EMP_PACKAGE.test1,0));EMP_PACKAGE.TEST2:=2;ELSE:NEW.salary :=:NEW.salary*0.9;RAISE_APPLICATION_ERROR(-20005,nvl(EMP_PACKAGE.test1,0));EMP_PACKAGE.TEST2:=2;END IF;END IF;END;---现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽before_update_salary报错)--现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽before_add_salary报错)2.after触发器--判断员工新薪水(行级)create or replace trigger after_update_salary_rowafter UPDATE ON EMPfor each rowbeginif:new.salary>:OLD.salary THENif:new.salary <5000THEN/*RAISE_APPLICATION_ERROR(-20006,nvl(EMP_PACKAGE.test4,0));*/EMP_PACKAGE.test3:=3;ELSE/* RAISE_APPLICATION_ERROR(-20007,nvl(EMP_PACKAGE.test4,0));*/ EMP_PACKAGE.test3:=3;END IF;END IF;end;----判断是否可以加薪或减薪(语句)create or replace trigger after_update_salaryafter UPDATE ON EMPbeginSELECT SUM(salary)INTO EMP_PACKAGE.new_sum FROM EMP;if EMP_PACKAGE.new_sum> EMP_PACKAGE.old_sum thenif EMP_PACKAGE.old_sum>=15000thenRAISE_APPLICATION_ERROR(-20008,nvl(EMP_PACKAGE.test3,0));EMP_PACKAGE.test4:=4;end if;elseif EMP_PACKAGE.old_sum<10000thenRAISE_APPLICATION_ERROR(-20009,nvl(EMP_PACKAGE.test3,0));EMP_PACKAGE.test4:=4;end if;end if;end;--现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽after_update_salary_row 报错)--现在对empno =5的员工薪水改为8000,执行得到以下报错(屏蔽after_update_salary报错)综合以上结果:oracle 一个表上的多个触发器的执行顺序如下:before 语句trigger->before 行级trigger->after 行级trigger->after 语句trigg er。
触发器是许多关系数据库系统都提供的一项技术。
在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
触发器类型触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。
即触发器是当某个事件发生时自动地隐式运行。
并且,触发器不能接收参数。
所以运行触发器就叫触发或点火(firing)。
ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。
ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。
1 DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
2 替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。
所以给出了替代触发器。
它就是ORACLE 8专门为进行视图操作的一种处理方法。
3 系统触发器ORACLE 8i 提供了第三种类型的触发器叫系统触发器。
它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
触发器组成:触发事件:引起触发器被触发的事件。
例如:DML语句(INSERT, UPDA TE, DELETE 语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。
Oracle数据库之PLSQL触发器Oracle数据库之PL/SQL触发器1. 介绍触发器(trigger)是提供给程序员和数据分析员来保证数据完整性的⼀种⽅法,它是与表事件相关的特殊的存储过程,它的执⾏不是由程序调⽤,也不是⼿⼯启动,⽽是由事件来触发,⽐如当对⼀个表进⾏操作(insert,delete,update)时就会激活它执⾏。
触发器经常⽤于加强数据的完整性约束和业务规则等。
触发器有三种类型,分别是:DML触发器、替代触发器和系统触发器。
DML触发器顾名思义,DML触发器是由DML语句触发的。
例如数据库的INSERT、UPDATE、DELETE操作都可以触发该类型的触发器。
它们可以在这些语句之前或之后触发,或者在⾏级上触发(就是说对于每个受影响的⾏都触发⼀次)。
替代触发器替代触发器只能使⽤在视图上,与DML不同的是,DML触发器是运⾏在DML之外的,⽽替代触发器是代替激发它的DML语句运⾏。
替代触发器是⾏触发器。
系统触发器这种触发器是发⽣在如数据库启动或关闭等系统事件时,不是在执⾏DML语句时发⽣,当然也可以在DDL时触发。
触发器功能强⼤,轻松可靠地实现许多复杂的功能,但是我们也应该慎⽤。
为什么⼜要慎⽤呢?触发器本⾝没有过错,但如果我们滥⽤,会造成数据库及应⽤程序的维护困难。
在数据库操作中,我们可以通过关系、触发器、存储过程、应⽤程序等来实现数据操作,同时约束、缺省值也是保证数据完整性的重要保障。
如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程度。
2. 触发器组成触发器主要由以下⼏个要素组成:1. 触发事件:引起触发器被触发的事件。
2. 触发时间:触发器是在触发事件发⽣之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该触发器的操作顺序。
3. 触发操作:触发器被触发之后的⽬的和意图,是触发器本⾝要做的事情。
4. 触发对象:包括表、视图、模式、数据库。
oracle trigger 语法Oracle触发器(trigger)是在表中执行的一段代码,用于在数据库中自动执行某些操作。
在执行特定操作时,可以使用Oracle触发器,例如在插入或更新记录时要向某个表添加新数据。
以下是Oracle触发器的语法:```CREATE [ OR REPLACE ] TRIGGER trigger_name{ BEFORE | AFTER } { INSERT | UPDATE | DELETE }ON table_name[ FOR EACH ROW ][ FOLLOWS another_trigger ][ ENABLE / DISABLE ][ DECLARE ][ BEGINtrigger_body;END; ]```- `CREATE [ OR REPLACE ] TRIGGER`:创建一个新的触发器或替换已经存在的触发器。
- `trigger_name`:触发器的名称。
- `{ BEFORE | AFTER }`:指定触发器在被触发的事件之前或之后执行。
- `{ INSERT | UPDATE | DELETE }`:指定触发器是在插入、更新还是删除时触发。
- `ON table_name`:指定触发器应用于哪个表。
- `[ FOR EACH ROW ]`:指定此触发器是否应逐行执行。
- `[ FOLLOWS another_trigger ]`:指定创建触发器的顺序。
- `[ ENABLE / DISABLE ]`:启用或禁用触发器。
- `[ DECLARE ]`:定义触发器所需的任何变量。
- `[ BEGIN trigger_body; END; ]`:指定在触发器被触发时所要执行的代码块。
其中,`trigger_body`是必须的代码块,它包含当触发器被触发时要执行的SQL语句。
请注意,Oracle触发器还有其他语法选项和功能,这里只是简单列出了基本语法。
ORACLE触发器的技术研究朱 伟(淮北矿业集团 通讯计算机处 安徽 淮北 235000)摘 要: 介绍DML触发器、替代触发器和系统触发器,它们是存储在数据库里的特殊存储过程。
当表、视图发生改变或发生特定用户事件、系统事件时将隐式激发定义在其上的触发器,数据库将自动执行触发器。
触发器能被作为数据库内置审计功能的有益补充用于审计。
关键词: DML触发器;替代触发器;系统触发器中图分类号:TP311 文献标识码:A 文章编号:1671-7597(2012)1120145-010 引言目前企业的计算机应用系统多数都是基于数据库的,在使用这些应用系统的时候,不可避免的要遇到一些数据库中有关数据完整性、批量删除和审计方面的问题。
在这方面触发器能很好的实现复杂的数据完整性检查和约束,拒绝或回退那些破坏相关完整性的变化;审计用户操作数据库的语句。
本文就是对Oracle触发器技术进行的介绍。
1 Oracle触发器的概念和类型数据库触发器是响应插入、更新或删除等数据库事件而执行的过程,它定义了当一些数据库相关事件发生时应采取的动作。
有三种主要的触发器类型:DML触发器、替代触发器和系统触发器。
1.1 DML触发器。
DML触发器就是对表或视图执行DML操作时激发的触发器,并且由该语句的类型决定DML触发器的类型。
它是一个与特定表相关联的存储过程,也就是说一个DML触发器仅与一个表相关联,但一个表可以对应多个DML触发器。
DML触发器分为行触发器和语句触发器,触发事件包括insert、update和delete,触发的时间可以在DML语句之前或之后。
1.2 替代触发器。
替代触发器只能定义在视图上而不能定义在表上,它由视图的DML事件激发而非DDL或数据库系统事件激发,它执行一个替代操作来代替触发语句的操作。
与DML触发器不同,DML触发器是在DML操作之外运行的,而替代触发器则代替激发它的DML语句运行。
替代触发器是行一级的。
oracle触发器的实例(转)触发器使⽤教程和命名规范⽬录触发器使⽤教程和命名规范 11,触发器简介 12,触发器⽰例 23,触发器语法和功能 34,例⼀:⾏级触发器之⼀ 45,例⼆:⾏级触发器之⼆ 46,例三:INSTEAD OF触发器 67,例四:语句级触发器之⼀ 88,例五:语句级触发器之⼆ 99,例六:⽤包封装触发器代码 1010,触发器命名规范 111,触发器简介触发器(Trigger)是数据库对象的⼀种,编码⽅式类似存储过程,与某张表(Table)相关联,当有DML语句对表进⾏操作时,可以引起触发器的执⾏,达到对插⼊记录⼀致性,正确性和规范性控制的⽬的。
在当年C/S时代盛⾏的时候,由于客户端直接连接数据库,能保证数据库⼀致性的只有数据库本⾝,此时主键(Primary Key),外键(Foreign Key),约束(Constraint)和触发器成为必要的控制机制。
⽽触发器的实现⽐较灵活,可编程性强,⾃然成为了最流⾏的控制机制。
到了B/S时代,发展成4层架构,客户端不再能直接访问数据库,只有中间件才可以访问数据库。
要控制数据库的⼀致性,既可以在中间件⾥控制,也可以在数据库端控制。
很多的青睐Java的开发者,随之将数据库当成⼀个⿊盒,把⼤多数的数据控制⼯作放在了Servlet中执⾏。
这样做,不需要了解太多的数据库知识,也减少了数据库编程的复杂性,但同时增加了Servlet编程的⼯作量。
从架构设计来看,中间件的功能是检查业务正确性和执⾏业务逻辑,如果把数据的⼀致性检查放到中间件去做,需要在所有涉及到数据写⼊的地⽅进⾏数据⼀致性检查。
由于数据库访问相对于中间件来说是远程调⽤,要编写统⼀的数据⼀致性检查代码并⾮易事,⼀般采⽤在多个地⽅的增加类似的检查步骤。
⼀旦⼀致性检查过程发⽣调整,势必导致多个地⽅的修改,不仅增加⼯作量,⽽且⽆法保证每个检查步骤的正确性。
触发器的应⽤,应该放在关键的,多⽅发起的,⾼频访问的数据表上,过多使⽤触发器,会增加数据库负担,降低数据库性能。
oracle触发器的创建insert使用方法Oracle触发器是与表相关联的数据库对象,可以在特定事件发生时自动触发一系列的操作。
其中,INSERT触发器可以在向表中插入数据时自动执行一些操作。
下面是Oracle触发器的创建及INSERT使用方法的详细介绍。
创建INSERT触发器的语法如下:```sqlCREATE [OR REPLACE] TRIGGER trigger_name{BEFORE , AFTER , INSTEAD OF} INSERT ON table_name[FOREACHROW][WHEN (condition)]DECLARE--定义变量BEGIN--触发器的主体,包含需要执行的操作END;```-`ORREPLACE`:可选关键字,表示如果同名的触发器已存在,将被替换。
-`BEFORE`、`AFTER`、`INSTEADOF`:表示触发器在插入之前、之后或替代插入之前执行。
- `INSERT ON table_name`:指定触发器与哪个表相关联。
-`FOREACHROW`:可选关键字,表示触发器对每行数据都触发一次。
如果不写这个关键字,触发器只在插入操作时触发一次。
- `WHEN (condition)`:可选关键字,表示触发器执行的条件。
示例:```sqlCREATE OR REPLACE TRIGGER emp_insert_triggerBEFORE INSERT ON employeesFOREACHROWDECLAREemp_count NUMBER;BEGIN--获取当前表中员工的数量SELECT COUNT(*) INTO emp_count FROM employees;--将员工数量加1并赋给新员工的ID:NEW.employee_id := emp_count + 1;END;```在上述示例中,我们创建了一个触发器`emp_insert_trigger`,在`employees`表中每次插入一行记录之前触发。
Oracle触发器是一种特殊类型的存储过程,它可以在特定的数据库操作发生时自动执行。
在实际应用中,我们经常会遇到需要使用Oracle触发器来实现一些复杂的业务逻辑。
在使用Oracle触发器时,我们需要根据具体的业务需求来设计触发器的逻辑,而针对不同的场景,需要使用不同的触发器写法。
本文将针对Oracle触发器的不同应用场景,介绍其对应的写法和注意事项。
一、触发器简介1.1 触发器概述Oracle触发器是一种特殊的数据库对象,它会在特定的数据库操作(如INSERT、UPDATE、DELETE)发生时自动触发执行。
触发器可以在数据库级别定义,对于特定的表和事件进行相应的响应操作。
在实际应用中,触发器常用于实现数据完整性约束、数据审计、实时计算等功能。
1.2 触发器类型在Oracle数据库中,触发器主要分为行级触发器和语句级触发器两种类型。
行级触发器会在每一行数据被操作时触发执行,而语句级触发器则会在整个SQL语句执行完成时触发执行。
在设计触发器时,需要根据具体的业务需求来选择合适的触发器类型。
二、Oracle触发器的应用场景及写法2.1 实现数据完整性约束在数据库中,我们经常需要实现一些数据完整性约束,如主键约束、外键约束等。
而触发器可以作为实现这些约束的一种手段。
我们可以使用触发器在插入或更新数据时,对数据进行校验,确保符合特定的约束条件。
对于主键约束,我们可以使用BEFORE INSERT触发器来实现,在数据插入前对主键进行校验,防止重复插入数据。
示例代码如下:```sqlCREATE OR REPLACE TRIGGER trg_check_pkBEFORE INSERT ON table_nameFOR EACH ROWDECLAREv_count NUMBER;BEGINSELECT COUNT(*) INTO v_countFROM table_nameWHERE primary_key = :new.primary_key;IF v_count > 0 THENR本人SE_APPLICATION_ERROR(-0, 'Primary key already exists');END IF;END;/```对于外键约束,我们可以使用AFTER INSERT、AFTER UPDATE触发器来实现,在数据插入或更新后对外键进行校验,确保引用的数据存在。
oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发...oracle 数据库开发应用实例,招生录取系统 ... | oracle 创建,删除存储过程,参数传递,创 ...2009-04-14oracle 触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器,关键字: oracle 触发器种类触发事件dml ddl 事件替代查看触发器的种类和触发事件触发器必须由事件才能触发。
触发器的触发事件分可为3类,分别是DML事件、DDL事件和数据库事件。
每类事件包含若干个事件,如下所示。
数据库的事件是具体的,在创建触发器时要指明触发的事件。
种类关键字含义Sql代码DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发DML事件(3种) INSERT 在表或视图中插入数据时触发UPDATE 修改表或视图中的数据时触发DELETE 在删除表或视图中的数据时触发DDL事件(3种) CREATE 在创建新对象时触发ALTER 修改数据库或数据库对象时触发DROP 删除对象时触发数据库事件(5种) STARTUP 数据打开时触发SHUTDOWN 在使用NORMAL或IMMEDIATE选项关闭数据库时触发LOGON 当用户连接到数据库并建立会话时触发LOGOFF 当一个会话从数据库中断开时触发SERVERERROR 发生服务器错误时触发触发器的类型可划分为4种:数据操纵语言(DML)触发器、替代(INSTEAD OF)触发器、数据定义语言(DDL)触发器和数据库事件触发器。
Oracle触发器的分类和使用摘要:在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle 系统自动触发。
触发器通常用于加强数据的完整性约束和业务规则等,对于表来说,触发器可以实现比CHECK约束更为复杂的约束。
本文介绍了Oracle触发器的概念,功能,优缺点,组成等方面。
详细解读了Oracle触发器在各方面的应用并配合相关实例。
关键字:Oracle、触发器、介绍、应用一、触发器的介绍1.1 触发器的概念在Oracle中,触发器是一种特殊的存储过程,它在发生某种数据库事件时由Oracle系统自动触发发器,通常用于加强数据的完整性约束和业务规则等。
触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的,而是由一个事件来启动运行。
即触发器是当某个时间发生时自动地隐式运行。
1.2 触发器的功能●允许/限制对表的修改●自动生成派生列,比如自增字段●强制数据一致性●提供审计和日志记录●防止无效的事务处理●启用复杂的业务逻辑1.3 触发器的优缺点优点:触发器可通过数据库中的相关表实现级联更改,不过,通过级联引用完整性约束可以更有效地执行这些更改。
触发器可以强制比用CHECK 约束定义的约束更为复杂的约束。
与CHECK 约束不同,触发器可以引用其它表中的列。
例如,触发器可以使用另一个表中的SELECT 比较插入或更新的数据,以及执行其它操作,如修改数据或显示用户定义错误信息。
触发器也可以评估数据修改前后的表状态,并根据其差异采取对策。
一个表中的多个同类触发器(INSERT、UPDA TE 或DELETE)允许采取多个不同的对策以响应同一个修改语句。
缺点:触发器功能强大,轻松可靠地实现许多复杂的功能,但是它也具有一些缺点那就是由于我们的滥用会造成数据库及应用程序的维护困难。
在数据库操作中,我们可以通过关系、触发器、存储过程、应用程序等来实现数据操作。
同时规则、约束、缺省值也是保证数据完整性的重要保障。
如果我们对触发器过分的依赖,势必影响数据库的结构,同时增加了维护的复杂程序。
1.4 触发器的组成1. 触发事件:引起触发器被触发的事件。
例如:DML语句(INSERT, UPDATE, DELETE 语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
2. 触发时间:即该TRIGGER是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER的操作顺序。
3. 触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。
例如:PL/SQL块。
4. 触发对象:包括表、视图、模式、数据库。
只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
5. 触发条件:由WHEN子句指定一个逻辑表达式。
只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。
6. 触发频率:说明触发器内定义的动作被执行的次数。
即语句级(STATEMENT)触发器和行级(ROW)触发器。
1.5 触发器触发次序I.执行BEFORE语句级触发器;II.对与受语句影响的每一行●执行BEFORE行级触发器●执行DML语句●执行AFTER行级触发器I.执行AFTER语句级触发器二、触发器的种类Oracle中的触发器的类型主要有DML触发器、替代触发器、系统事件触发器和DDL 触发器。
2.1 DML触发器DML触发器由DML语句触发,例如INSERT、UPDATE和DELETE语句。
针对所有的DML事件,按触发的时间可以将DML触发器分为BEFORE触发器与AFTER触发器,分别表示在DML事件发生之前与之后采取行动。
另外,DML触发器也可以分为语句级触发器与行迹触发器,其中,语句级触发器针对某一条语句触发一次,而行级触发器则针对语句所影响的每一行都触发一次。
例如:某条UPDATE语句修改了表中的100行数据,那么针对该UPDATE事件的语句级触发器将被触发一次,而行级触发器将被触发100次。
例1: 建立一个触发器, 当职工表emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
CREATE TABLE emp_his AS SELECT * FROM EMP WHERE 1=2;CREATE OR REPLACE TRIGGER tr_del_empBEFORE DELETE --指定触发时机为删除操作前触发ON scott.empFOR EACH ROW --说明创建的是行级触发器BEGIN --将修改前数据插入到日志记录表del_emp,以供监督使用。
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )V ALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, :m, :old.h iredate );END;--测试触发器DELETE emp WHERE empno=7788;DROP TABLE emp_his;DROP TRIGGER del_emp;2.2 替代触发器INSTEAD OF触发器又称为替代触发器,用于执行一个替代操作来代替触发事件的操作。
例如:针对INSERT事件的INSTEAD OF触发器,它由INSERT语句触发,当出现INSERT 语句时,该语句不会被执行,而是执行INSTEAD OF触发器中定义的语句。
创建INSTEAD OF触发器需要注意以下几点:●只能被创建在视图上,并且该视图没有指定WITH CHECK OPTION选项。
●不能指定BEFORE 或AFTER选项。
●FOR EACH ROW子可是可选的,即INSTEAD OF触发器只能在行级上触发、或只能是行级触发器,没有必要指定。
●没有必要在针对一个表的视图上创建INSTEAD OF触发器,只要创建DML触发器就可以了。
2.3 系统事件触发器系统事件触发器在发生如数据库启动或者关闭等系统事件时触发,包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。
例2:创建登录、退出触发器。
CREATE TABLE log_event(user_name VARCHAR2(10),address V ARCHAR2(20),logon_date timestamp,logoff_date timestamp);--创建登录触发器CREATE OR REPLACE TRIGGER tr_logonAFTER LOGON ON DATABASEBEGININSERT INTO log_event (user_name, address, logon_date)V ALUES (ora_login_user, ora_client_ip_address, systimestamp);END tr_logon;--创建退出触发器CREATE OR REPLACE TRIGGER tr_logoffBEFORE LOGOFF ON DA TABASEBEGININSERT INTO log_event (user_name, address, logoff_date)V ALUES (ora_login_user, ora_client_ip_address, systimestamp);END tr_logoff;2.4 DDL触发器DDL触发器由DDL语句触发,例如:CREATE、ALTER和DROP语句。
DDL触发器同样可以分为BEFORE触发器与AFTER触发器。
三、触发器的应用Oracle触发器一般应用在以下方面:3.1 确保数据库的安全性●可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
●可以基于数据库中的数据限制用户的操作,例如不允许价格的升幅一次超过10%。
3.2 实施复杂的安全性授权●利用触发器控制实体的安全性,可以将权限藉于各种数据库的值。
3.3 提供复杂的审计功能●审计用户操作数据库的语句。
●把用户对数据库的更新写入审计表。
3.4 维护不同数据库之间同步表●在不同的数据库之间可以利用快照来实现数据的复制,但有些系统要求两个数据库数据实时同步,就必须利用触发器从一个数据库中向另一个数据库复制数据。
3.5 实现复杂的数据完整性规则●实现非标准的数据完整性检查和约束。
触发器可产生比规则更为复杂的限制。
与规则不同,触发器可以引用列或数据库对象。
●提供可变的缺省值。
3.6 实现复杂的非标准的数据库相关完整性规则●触发器可以对数据库中相关的表进行连环更新。
例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。
●触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。
当插入一个与其主健不匹配的外部键时,这种触发器会起作用。
四、编写触发器注意事项●触发器不接受参数。
●一个表上最多可有12个触发器,但同一时间、同一事件、同一类型的触发器只能有一个。
并各触发器之间不能有矛盾。
●在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。
●触发器最大为32KB。
若确实需要,可以先建立过程,然后在触发器中用CALL语句进行调用。
●在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。
●触发器中不能包含事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。
因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
●在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。
●在触发器主体中不能申明任何Long和blob变量。
新值new和旧值old也不能向表中的任何long和blob列。
●不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。
●触犯器声明变量赋值方式和dephi类似,使用:= 符号来赋值。
新值new, 旧值old前面不要忘记:符号。
参考文献[1] 《Oracle11g 数据库应用简明教程》, 杨少敏王红敏, 清华大学出版社, 2010[2] 《Oracle触发器在信息系统安全方面的应用》, 谢梅源, 温州职业技术学院学报, 2004[3] 《基于Oracle数据库存储过程与触发器的应用》, 刘小生张世良, 江西有色金属, 2007[4] 《Oracle中特殊类型触发器的使用》, 王二暖, 华南金融电脑应用技术, 2007[5] 《Oracle数据库触发器及其应用》, 王杰文李赫男, 计算机应用研究, 2001[6] 《Oracle触发器的功能与应用》, 梁桦, 北京电脑技术应用研究所, 2004。