ORACLE TRIGGER(全面讲解)
- 格式:doc
- 大小:248.50 KB
- 文档页数:28
Oracle触发器创建及其功能Oracle触发器创建及其功能下面的文章主要介绍的是如何创建Oracle触发器,同时介绍了Oracle触发器的功能、语法,而且通过具体的例子可以让大家更深入的掌握。
1.创建表t1 :create table t1 (id number,name nvarchar(8));2.创建Oracle序列:CREATE SEQUENCE t1_id INCREMENT BY 1 START WITH 1 MAXVALUE3.创建Oracle触发器:CREATE TRIGGER tig_insert_t1BEFORE INSERT ON "YINZQ"."T1"beginif (:new.id is null) thenselect t1_id.nextval into :new.id from dual; //其中的:new.id 指的是t1表中新行的列end if;end;4.Oracle触发器功能触发器是特定事件出现的时候,自动执行的代码块。
类似于存储过程,触发器与存储过程的.区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
功能:1)允许/限制对表的修改2)自动生成派生列,比如自增字段3)强制数据一致性4)提供审计和日志记录5)防止无效的事务处理6)启用复杂的业务逻辑5.触发器触发使用有两种:after和before。
Oracle触发器的语法:CREATE [OR REPLACE] TIGGER触发器名触发时间触发事件ON表名[FOR EACH ROW]BEGINpl/sql语句END1)触发器名:触发器对象的名称。
由于触发器是数据库自动执行的,因此该名称只是一个名称,没有实质的用途。
2)触发时间:指明触发器何时执行,该值可取:before---表示在数据库动作之前触发器执行;after---表示在数据库动作之后出发器执行。
Oracle触发器的概念和类型2008-04-16 14:23:34摘要:本文介绍了oracle触发器的概念和类型。
关键词:触发器、oracle。
1.引言2.触发器的概念和类型触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。
数据库触发器有以下的作用:* 安全性。
可以基于数据库的值使用户具有操作数据库的某种权利。
# 可以基于时间限制用户的操作,例如不允许下班后和节假日修改数据库数据。
# 可以基于数据库中的数据限制用户的操作,例如不允许股票的价格的升幅一次超过10%。
* 审计。
可以跟踪用户对数据库的操作。
# 审计用户操作数据库的语句。
# 把用户对数据库的更新写入审计表。
* 实现复杂的数据完整性规则。
# 实现非标准的数据完整性检查和约束。
触发器可产生比规则更为复杂的限制。
与规则不同,触发器可以引用列或数据库对象。
例如,触发器可回退任何企图吃进超过自己保证金的期货。
# 提供可变的缺省值。
* 实现复杂的非标准的数据库相关完整性规则。
触发器可以对数据库中相关的表进行连环更新。
例如,在auths表author_code列上的删除触发器可导致相应删除在其它表中的与之匹配的行。
# 在修改或删除时级联修改或删除其它表中的与之匹配的行。
# 在修改或删除时把其它表中的与之匹配的行设成NULL值。
# 在修改或删除时把其它表中的与之匹配的行级联设成缺省值。
# 触发器能够拒绝或回退那些破坏相关完整性的变化,取消试图进行数据更新的事务。
当插入一个与其主健不匹配的外部键时,这种触发器会起作用。
例如,可以在books.author_code列上生成一个插入触发器,如果新值与auths.author_ code列中的某值不匹配时,插入被回退。
* 同步实时地复制表中的数据。
* 自动计算数据值,如果数据的值达到了一定的要求,则进行特定的处理。
例如,如果公司的帐号上的资金低于5万元则立即给财务人员发送警告数据。
第一章PL/SQL简介一、PL/SQL:过程化的SQL语言,也就是在SQL语句的基础上加入了条件判断、循环等过程化的语句。
用SQL语句进行编程使SQL能够完成更加复杂的操作和计算。
二、PL/SQL块1、块结构Declare--声明部分,所有的变量或常量,在此部分声明--如果程序中不需要变量或常量,此部分可省略Begin--可执行部分,功能的实现部分,不能省略Exception--异常处理部分--此部分可以省略End;--结束部分,标识了程序的边界,不能省略--end关键字末尾一定要加;结尾--每一条语句用一行书写,末尾用;结尾2、编辑和运行PL/SQL块a.要在SQLplus环境下编辑,运行。
--也可以在PL/SQL developer 中新建Command Window中b.用/来运行PL/SQL块----------------------------------------------------------------------------C:\Documents and Settings\ttc>sqlplus scott/tiger@orclSQL*Plus: Release 10.2.0.1.0 - Production on 星期一2月21 09:20:20 2011Copyright (c) 1982, 2005, Oracle. All rights reserved.连接到:Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - ProductionWith the Partitioning, OLAP and Data Mining optionsSQL> declare2 ...3 ...4 begin5 ...6 exception7 ...8 end;9 /----------------------------------------------------------------------------3、输出语句dbms_output.put_line(列|表达式|变量);--包.过程(参数),向屏幕上输出列|表达式|变量的值serveroutput 环境变量--在一个会话开始的时候,要设置环境变量serveroutput为打开状态,此会话中的所有的PL/SQL块才能输出值到屏幕上--PL/SQL developer中,一个会话就是一个新建的Command Window文件--通常在PL/SQL developer中的Command Window文件,使用Editor编辑(F8执行) Set serveroutput On练习1:编辑一个PL/SQL块,输出hello world.--------------------------------------------------------------------------------------------SQL> begin2 dbms_output.put_line('Hello world');3 end;4 /Hello worldPL/SQL procedure successfully completed--------------------------------------------------------------------------------------------4、块的类型a.匿名块:没有名字的PL/SQL块,不能够存储,只能写一次执行一次,也是不能被调用。
Trigger的用法总结1. 什么是Trigger?Trigger(触发器)是数据库管理系统中的一种特殊的存储过程,它在定义的事件发生时自动执行。
触发器可以在插入、更新或删除数据时触发,可以用于实现数据的完整性约束、自动化业务逻辑等功能。
2. 触发器的语法触发器的语法可以根据具体的数据库管理系统有所差异,下面是一个通用的触发器语法:CREATE TRIGGER trigger_name{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name[FOR EACH ROW][WHEN (condition)]BEGIN-- 触发器的执行逻辑END;•trigger_name:触发器的名称,应具有唯一性。
•BEFORE或AFTER:指定触发器的执行时间,BEFORE表示在事件之前执行,AFTER表示在事件之后执行。
•INSERT、UPDATE或DELETE:指定触发器要监控的事件类型。
•table_name:要监控的表名。
•FOR EACH ROW:表示触发器针对每一行数据都会执行,可以省略。
•WHEN (condition):指定触发器的条件,只有满足条件时触发器才会执行,可以省略。
•BEGIN和END:触发器的执行逻辑应该放在BEGIN和END之间。
3. 触发器的重要观点3.1 触发器的类型根据触发器的执行时间,可以将触发器分为两种类型:BEFORE触发器和AFTER触发器。
•BEFORE触发器:在事件之前执行,可以用于验证数据的完整性、修改数据等操作。
例如,可以在插入数据之前检查数据的有效性,或者在更新数据之前对数据进行预处理。
•AFTER触发器:在事件之后执行,可以用于记录日志、发送通知等操作。
例如,可以在插入数据之后记录操作日志,或者在删除数据之后发送邮件通知。
3.2 触发器的事件类型触发器可以监控的事件类型包括:•INSERT:插入数据时触发。
常用Trigger的触发时机●Form Level:●Block Level:Item Level:常见的Trigger触发顺序触发器执行顺序:1.当打开FORM时:(1)PRE-FORM(2)PRE-BLOCK(BLOCK级)(3)WHEN-NEW-FORM-INSTANCE(4)WHEN-NEW-BLOCK-INSTANCE(5)WHEN-NEW-RECORD-INSTANCE(6)WHEN-NEW-ITEM-INSTANCE2.当填写一行记录完成后,光标移动到下一条记录的时候:(1)WHEN-VALIDATE-RECORD(只将填写的记录与数据库中已存在的记录作唯一性的验证,如果只是页面上的数据重复而数据库中没有与其重复的值则不会报错.)(2)WHEN-NEW-RECORD-INSTANCE(3)WHEN-NEW-ITEM-INSTANCE3.当点击“保存”时(1)WHEN-VALIDATE-RECORD(将页面上的所有数据提交到数据库,若页面上有重复的数据,则提交第一次时成功但只是将数据先写到数据库中一类似临时表的地方,在提交第二条重复记录的时候报错,执行事务回滚,原来执行成功的指令也将被撤消)(2)PRE-INSERT(3)ON-INSERT(4)POST-INSERT(5)POST-FORMS-COMMIT(6)PRE-BLOCK(BLOCK级)(7)KEY-COMMIT(8)WHEN-NEW-ITEM-INSTANCE4.当光标移动到当前数据块中已经显示的行上时:(1)WHEN-REMOVE-RECORD(2)WHEN-NEW-RECORD-INSTANCE(3)WHEN-NEW-ITEM-INSTANCE当在该行上的不同ITEM移动时:(4)WHEN-NEW-ITEM-INSTANCE5.当要进行修改时(在记录中的某个项上进行了修改时):(1)ON-LOCK6.在修改完成后进行保存时:(1)WHEN-VALIDATE-RECORD(2)PRE-UPDATE(3)ON-UPDATE(4)POST-FORMS-COMMIT(5)PRE-BLOCK(BLOCK级)(6)KEY-COMMIT(7)WHEN-NEW-ITEM-INSTANCE7.删除一条记录时:(1)ON-LOCK(2)WHEN-REMOVE-RECORD(3)KEY-DELREC(4)WHEN-NEW-RECORD-INSTANCE(5)WHEN-NEW-ITEM-INSTANCE8.F11查询过程:(1)WHEN-CLEAR-BLOCK(2)WHEN-NEW-RECORD-INSTANCE(3)WHEN-NEW-ITEM-INSTANCE在输入查询条件后点CTRL+F11:(4)PRE-QUERY(5)WHEN-CLEAR-BLOCK(6)POST-QUERY(7)WHEN-NEW-RECORD-INSTANCE(8)WHEN-NEW-ITEM-INSTANCE9.CRRL+F11:(1)WHEN-CLEAR-BLOCK(2)PRE-QUERY(3)WHEN-CLEAR-BLOCK(4)POST-QUERY(每查一条记录,触发一次)(5)WHEN-NEW-RECORD-INSTANCE(6)WHEN-NEW-ITEM-INSTANCE10.从查询状态(F11)转为输入状态(F4)时:(1)WHEN-CLEAR-BLOCK(2)KEY-EXIT(3)WHEN-NEW-RECORD-INSTANCE(4)WHEN-NEW-ITEM-INSTANCE11.手电筒查询过程:(1)QUERY_FIND(BLOCK级)输入查询条件后,点击“查询”按钮:(2)WHEN-CLEAR-BLOCK(3)PRE-QUERY(4)WHEN-CLEAR-BLOCK(5)POST-QUERY(6)WHEN-NEW-RECORD-INSTANCE(7)WHEN-NEW-ITEM-INSTANCE12.点击“New”时:(1)WHEN-NEW-RECORD-INSTANCE(2)WHEN-NEW-ITEM-INSTANCE13.点击“EditField”时:(1)KEY-EDIT14.点击“WindowHelp”时:(1)KEY-HELP15.点击“ClearRecord”时:(1)WHEN-REMOVE-RECORD(2)POST-QUERY(3)WHEN-NEW-RECORD-INSTANCE(4)WHEN-NEW-ITEM-INSTANCE16.点击F4关闭时:(1)KEY-EXIT(2)POST-FORM17.点击“CloseForm”按钮关闭时:(1)KEY-EXIT(2)POST-FORM18.点击“Translations”按钮时:(1)TRANSLATIONS19.点击小叉号关闭时:(1)WHEN-WINDOW-CLOSED(2)CLOSE-WINDOW(3)KEY-EXIT(4)POST-FORM20.选中LOV列表:(1)KEY-LISTVAL(2)WHEN-NEW-ITEM-INSTANCE21.选中记录前面的小条时:(1)WHEN-NEW-RECORD-INSTANCE(2)WHEN-NEW-ITEM-INSTANCE(数据项级)(3)WHEN-NEW-ITEM-INSTANCE22.光标上下移动时:(1)WHEN-NEW-RECORD-INSTANCE(2)WHEN-NEW-ITEM-INSTANCE。
oracle触发器写法首先,什么是oracle触发器?Oracle触发器是一种数据库对象,它允许在进行插入,更新或删除操作时自动执行指定的动作,以此来减少人工干预,提高工作效率,实现自动化的效果。
Oracle触发器的标准写法,可以让程序员更容易地实现触发器有效执行,并根据要求调整参数,以满足不同表之间的关系、结构和保证程序正确性。
在编写使用oracle触发器的程序前,必须先熟悉触发器的标准写法,以及使用触发器实现的概念。
1、创建触发器的语法格式:CREATE [OR REPLACE] TRIGGER发器名称{BEFORE|AFTER|INSTEAD OF} {INSERT|UPDATE|DELETE}[ON名][FOR EACH ROW][WHEN (条件)]BEGIN[SQL语句]END;其中,CREATE OR REPLACE TRIGGER可以替换现有触发器,其余语句都是可选的部分,如果不使用,可以用空值代替。
【BEFORE | AFTER | INSTEAD OF】BEFORE命令指示表达式在触发动作之前执行,AFTER表示在触发动作之后执行,INSTEAD OF表示替换触发动作后的执行,这些是指定执行动作的时机。
【INSERT | UPDATE | DELETE】指定触发动作,可以是插入、更新或删除。
【ON名】指定触发器绑定的表,触发器可以是视图或表的触发器,但不能是索引、序列或函数的触发器。
【FOR EACH ROW】如果该语句存在,表示触发器发生的动作是每行记录的动作;如果不存在,则表示仅有整个表的动作发生。
【WHEN (条件)】可以选择性使用,指定触发器的触发条件,只有满足该条件时,触发器才会发生。
【BEGIN】表示触发器内容的开始,必须跟随着END;结束。
【SQL语句】在BEGIN和END之间可以书写任意有效的SQL语句,如果使用PL/SQL语句,则需要先使用DECLARE定义环境变量。
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触发器的实例(转)触发器使⽤教程和命名规范⽬录触发器使⽤教程和命名规范 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 TRIGGER (全面讲解)本篇主要内容如下:8.1 触发器类型8.1.1 DML触发器8.1.2替代触发器8.1.3系统触发器8.2 创建触发器8.2.1触发器触发次序8.2.2创建DML触发器8.2.3创建替代(INSTEAD OF)触发器8.2.3创建系统事件触发器8.2.4系统触发器事件属性8.2.5使用触发器谓词8.2.6重新编译触发器8.3 删除和使能触发器8.4 触发器和数据字典8.5 数据库触发器的应用举例触发器是许多关系数据库系统都提供的一项技术。
在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。
8.1 触发器类型触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。
即触发器是当某个事件发生时自动地隐式运行。
并且,触发器不能接收参数。
所以运行触发器就叫触发或点火(firing)。
ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。
ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。
所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。
8.1.1 DML触发器ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
8.1.2替代触发器由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。
所以给出了替代触发器。
它就是ORACLE 8专门为进行视图操作的一种处理方法。
8.1.3系统触发器ORACLE 8i 提供了第三种类型的触发器叫系统触发器。
它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。
触发器组成:●触发事件:引起触发器被触发的事件。
例如:DML语句(INSERT, UPDATE, DELETE语句对表或视图执行数据处理操作)、DDL语句(如CREATE、ALTER、DROP语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
●触发时间:即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。
●触发操作:即该TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。
例如:PL/SQL 块。
●触发对象:包括表、视图、模式、数据库。
只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
●触发条件:由WHEN子句指定一个逻辑表达式。
只有当该表达式的值为TRUE时,遇到触发事件才会自动执行触发器,使其执行触发操作。
●触发频率:说明触发器内定义的动作被执行的次数。
即语句级(STATEMENT)触发器和行级(ROW)触发器。
语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
编写触发器时,需要注意以下几点:●触发器不接受参数。
●一个表上最多可有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触发器、系统触发器)的语法格式和作用有较大区别。
8.2 创建触发器创建触发器的一般语法是:CREATE[OR REPLACE]TRIGGER trigger_name{BEFORE | AFTER }{INSERT|DELETE|UPDATE[OF column [, co lumn …]]}[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]ON[schema.]table_name |[schema.]view_name[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}][FOR EACH ROW ][WHEN condition]PL/SQL_BLOCK | CALL procedure_name;其中:BEFORE 和AFTER指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。
FOR EACH ROW选项说明触发器为行触发器。
行触发器和语句触发器的区别表现在:行触发器要求当一个DML语句操走影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。
当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则只能为行触发器。
REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。
触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。
WHEN 子句说明触发约束条件。
Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。
WHEN 子句指定的触发约束条件只能用在BEFORE 和AFTER 行触发器中,不能用在INSTEAD OF 行触发器和其它类型的触发器中。
当一个基表被修改( INSERT, UPDATE, DELETE)时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。
每张表最多可建立12 种类型的触发器,它们是:BEFORE INSERTBEFORE INSERT FOR EACH ROWAFTER INSERTAFTER INSERT FOR EACH ROWBEFORE UPDATEBEFORE UPDATE FOR EACH ROWAFTER UPDATEAFTER UPDATE FOR EACH ROWBEFORE DELETEBEFORE DELETE FOR EACH ROWAFTER DELETEAFTER DELETE FOR EACH ROW8.2.1触发器触发次序1.执行BEFORE语句级触发器;2.对与受语句影响的每一行:●执行BEFORE行级触发器●执行DML语句●执行AFTER行级触发器3.执行AFTER语句级触发器8.2.2创建DML触发器触发器名与过程名和包的名字不一样,它是单独的名字空间,因而触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。
DML触发器的限制●CREATE TRIGGER语句文本的字符长度不能超过32KB;●触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。
●触发器中不能使用数据库事务控制语句COMMIT; ROLLBACK, SVAEPOINT 语句;●由触发器所调用的过程或函数也不能使用数据库事务控制语句;●触发器中不能使用LONG, LONG RAW 类型;●触发器内可以参照LOB 类型列的列值,但不能通过:NEW 修改LOB列中的数据;DML触发器基本要点●触发时机:指定触发器的触发时间。
如果指定为BEFORE,则表示在执行DML操作之前触发,以便防止某些错误操作发生或实现某些业务规则;如果指定为AFTER,则表示在执行DML操作之后触发,以便记录该操作或做某些事后处理。
●触发事件:引起触发器被触发的事件,即DML操作(INSERT、UPDATE、DELETE)。
既可以是单个触发事件,也可以是多个触发事件的组合(只能使用OR逻辑组合,不能使用AND逻辑组合)。
●条件谓词:当在触发器中包含多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用ORACLE提供的如下条件谓词。
1)。
INSERTING:当触发事件是INSERT时,取值为TRUE,否则为FALSE。
2)。
UPDATING [(column_1,column_2,…,col umn_x)]:当触发事件是UPDATE时,如果修改了column_x列,则取值为TRUE,否则为FALSE。
其中column_x是可选的。
3)。
DELETING:当触发事件是DELETE时,则取值为TRUE,否则为FALSE。
解发对象:指定触发器是创建在哪个表、视图上。
●触发类型:是语句级还是行级触发器。
●触发条件:由WHEN子句指定一个逻辑表达式,只允许在行级触发器上指定触发条件,指定UPDATING后面的列的列表。
问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.实现: :NEW 修饰符访问操作完成后列的值:OLD 修饰符访问操作完成前列的值例1:建立一个触发器, 当职工表emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
CREATE TABLE emp_his AS SELECT*FROM EMP WHERE1=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 ) VALUES( :old.deptno, :old.empno, :old.ename , :old.job,:old.mgr, :old.sal, : m, :old.hiredate );END;DELETE emp WHERE empno=7788;DROP TABLE emp_his;DROP TRIGGER del_emp;例2:限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。