2024年4月19日发(作者:)

Oracle触发器详解

一、触发器概述

触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,但

是用户不能直接调用他们。

功能:

1、 允许/限制对表的修改

2、 自动生成派生列,比如自增字段

3、 强制数据一致性

4、 提供审计和日志记录

5、 防止无效的事务处理

6、 启用复杂的业务逻辑

触发器触发时间有两种:after和before。

1、触发器的语法:

CREATE [OR REPLACE] TIGGER触发器名 触发时间 触发事件

ON表名

[FOR EACH ROW]

BEGIN

pl/sql语句

END

其中:

触发器名:触发器对象的名称。

由于触发器是数据库自动执行的,因此该名称只是一个名称,

没有实质的用途。

触发时间:指明触发器何时执行,该值可取:

before---表示在数据库动作之前触发器执行;

after---表示在数据库动作之后出发器执行。

触发事件:指明哪些数据库动作会触发此触发

器:

insert:数据库插入会触发此触发器;

update

:数据库修改会触发此触发器;

delete:数据库删除会触发此触发器。

表名:数据库触发器所在的表。

for each row:对表的每一行触发器执行一次。如果没有这一选项,则只对

整个表执行一次。

触发器的组成部分:

1、 触发器名称

2、 触发语句

3、 触发器限制

4、 触发操作

触发器类型:

1、 语句触发器

2、 行触发器

3、 INSTEAD OF 触发器

4、 系统条件触发器

5、 用户事件触发器

注释:

before和after:指在事件发生之前或之后激活触发器。

instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用

的事件。

insert、 delete和update:指定构成触发器事件的数据操纵类型,update还

可以制定列的列表。此类触发器用的不多,经常用于视图,不做重点。

table_or_view_name:指要创建触发器的表或视图的名称。

for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不

使用此子句,则为语句级触发器。

when:限制执行触发器的条件,该条件可以包括新旧数据值得检查。

declare---end:是一个标准的PL/SQL块。

referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new

和old。在触发器中,有两个重要行级绑定变量。:old 和 :new

弄一个表,啥子都

说明了。

insert

delete

update

:old

NO

YES

YES

:new

YES

NO

YES

触发器不能过度的使用,不然可能会出去死循环,效率低,无法维护等问题。所以,还是

要慎重使用触发器。对如:在数据修改时需要自动完成一些工作,就可以使用触发器。

使用场合:

控制数据安全 实现数据审计 实现数据完整性 实现参照完整性。

管理触发器(使用工具操作会很简单):

1、显示触发器

select 触发器名字,status from user_triggers where table_name='emp';

2、禁止触发器

alter trigger 触发器名字 disable (all triggers) ;--红色部分表示对表的所有触发器执行操作

3、激活触发器

alter trigger 触发器名字 enable (all triggers);

4、删除触发器

drop trigger 触发器名字;

触发器和存储过程:

编号

编号

触发器

无参数、返回值

不能commit或则rollback

过程

有参数、有返回值(参数)

手工调用

与表无关

调用方式 时间发生时自动调用

操作对象 基于某张表