第四章 触发器

触发器
一、概念:
触发器在数据库里是以独立的对象在存储,是由一个事件来启动运行。即: 触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。
ORACLE中的事件指的是 更新操作。如对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作

触发器常用来完成由数据库的完整性约束 难以完成的 复杂业务规则的 约束,或用来监视对数据库的各种操作,实现审计的功能。

二、触发器的类型和工作特点:
1、DML触发器
ORACLE可以在DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
2、替代触发器(不常用)
由于在ORACLE里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是ORACLE 8专门为进行视图操作的一种处理方法。
3、系统触发器(项目上也不常用)
ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在ORACLE数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等。

三、编写触发器规则:
触发器是不接受参数信息的。
一个表上最多可有12个触发器[BEFORE INSERT
BEFORE INSERT FOR EACH ROW
AFTER INSERT
AFTER INSERT FOR EACH ROW
 
BEFORE UPDATE
BEFORE UPDATE FOR EACH ROW
AFTER UPDATE
AFTER UPDATE FOR EACH ROW
 
BEFORE DELETE
BEFORE DELETE FOR EACH ROW
AFTER DELETE
AFTER DELETE FOR EACH ROW
],但同一时间、同一事件、同一类型的触发器只能有一个。并且各种触发器之间不能有矛盾。
在一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。
触发器最大为32KB。若确实需要,可以先建立存储过程,然后在触发器中用CALL语句进行调用它。
在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE),不能使用DDL语句(CREATE、ALTER、DROP)。
触发器中不能包含TCL 事务控制语句(COMMIT,ROLLBACK,SAVEPOINT)。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退了。
在触发器主体中调用的任何过程、函数,都不能使用事务控制语句。
在触发器主体中不能申明任何Long和blob变量。新值new和旧值old也不能是表中的任何long和blob列。
不同类型的触发器(如DML触发器、INSTEAD OF触发器、系统触发器)的语法格式和作用有较大区别。

四、顺序语法:
1.create 【or replace】 trigger + 触发器名
2.触发时机 二选一 (before:操作之前触发,after:操作之后触发)
3.触发事件
{insert |delete |update [of 列1 [,列2 …]]}

[or {insert |delete |update [of 列1 [,列2 …]](DML)多个时用or连接;[一个触发器最多三个 ] 用update时 + (of 字段)
4.on 表名或视图;(数据库触发器所在的表)
5.for each row –创建行级触发器,针对表级,语句级时不用写
6.when 限定触发条件(可选) 必须是行级的才可以指定when条件
7.begin –将触发操作前数据插入到日志记录表,以供监督使用。
8.PL/sql执行语句(可以嵌套declare begin end;来使用变量名字)
9.end;
第八点:用的是PL/SQL块 或 调用储存过程
注:raise_application_error() –触发异常弹窗;
注:如果内存过大的时候就用存储过程调用
注:在触发器的执行部分只能用DML语句(SELECT、INSERT、UPDATE、DELETE)。 触发事件只能用or隔开。Where 子句指定的触发约束条件只能用在before 和after 行触发器中
两种方式取值:
new 列 :新值.列名;
old 列 :旧值.列名(数据更新之前的)

五、单表中的多个触发器触发次序:
1.先 执行 before语句级触发器;
2.再对与受语句影响的每一行:
1)执行 before行级触发器
2)执行 DML语句
3)执行 after行级触发器 
3.最后执行 after语句级触发器

六、创建DML触发器:
    触发器名与过程名和包的名字不一样,它是单独的名字空间,因而触发器名可以和表或过程有相同的名字[但是 最好不要同名,避免混淆],但在一个模式中触发器名不能相同。
DML触发器的限制
l         CREATE TRIGGER语句文本的字符长度不能超过32KB;
l         触发器体内的SELECT 语句只能为select … into …结构,或者为定义游标cursor所使用的select 语句。
l         触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SAVEPOINT 语句;
l         由触发器所调用的过程或函数也不能使用数据库事务控制语句;
l         触发器中不能使用LONG, LONG RAW 类型;
l         触发器内可以参照BLOB 类型列的列值,但不能通过 :NEW 修改BLOB列中的数据;

七、DML触发器基本要点:
触发时机:指定触发器的触发时间。
如果指定为BEFORE,则表示在执行DML操作之前触发,以便防止某些错误操作发生或实现某些业务规则;

如果指定为AFTER,则表示在执行DML操作之后触发,以便记录该操作或做某些事后处理。
触发事件:引起触发器被触发的事件,即DML操作(INSERT、UPDATE、DELETE)。既可以是单个触发事件,也可以是多个触发事件的组合(只能使用OR逻辑组合,不能使用AND逻辑组合)。
条件谓词:当在触发器中包含多个触发事件(INSERT、UPDATE、DELETE)的组合时,为了分别针对不同的事件进行不同的处理,需要使用ORACLE提供的如下条件谓词:

inserting: 触发条件为添加整行时执行;当触发事件是INSERT时,取值为TRUE,否则为FALSE。

updating (‘列名’):触发条件为修改()列时执行;当触发事件[If updating (‘列1’) then
If updating (‘列2’) then]是UPDATE 时,如果修改了列x列,则取值为TRUE,否则为FALSE。其中列x是可选的。谓词作为条件使用: 列名需要用括号和单引号包括

扫描二维码关注公众号,回复: 2604627 查看本文章

deleting:触发条件为删除整行时执行;当触发事件是DELETE时,则取值为TRUE,否则为FALSE。

触发对象:指定触发器是创建在哪个表、视图上。
触发类型:是语句级还是行级触发器。
触发条件:由WHEN子句指定一个逻辑表达式,只允许在行级触发器上指定触发条件,指定UPDATING后面的列的列表,或者指定表的原来old或新new的信息。

猜你喜欢

转载自blog.csdn.net/weixin_42800008/article/details/81297588
今日推荐