PL/SQL之触发器

PL/SQL之触发器

触发器是许多关系数据库系统都提供的一项技术。在 ORACLE 系统里, 触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块 。

一 触发器类型

触发器在数据库里以独立的对象存储 ,它与存储过程不同的是,存储过程通过其它程序来启动运行或直接启动运行,而 触发器是由一个事件来启动运行 。 即触发器是当某个事件发生时自动地隐式运行 。并且,触发器不能接收参数 。所以 运行触发器就叫触发或点火。 ORACLE 事件指的是对数据库的表进行的INSERT 、 UPDATE 及 DELETE 操作或对视图进行类似的操作 。 ORACLE 将触发器的功能扩展到了 触发 ORACLE,如数据库的启动与关闭等。

1 DML触发器
ORACLE 可以在 DML 语句进行触发,可以在 DML 操作前或操作后 进行触发,并且 可以对每个行或语句操作上进行触发
2 替代触发器
由于在 ORACLE 里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。
3 系统触发器
它可以在ORACLE 数据库系统的事件中进行触发,如 ORACLE 系统的启动与关闭等。

触发器的组成:
(1)触发事件 :即在何种情况下触发 TRIGGER; 例如: INSERT, UPDATE, DELETE 。
(2)触发时间 :即该 TRIGGER 是在触发事件发生之前BEFORE还是之后 AFTER 触发,也就是触发事件和该 TRIGGER 的操作顺序。
(3)触发器本身 :即该 TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如: PL/SQL 块。
(4)触发频率 :说明触发器内定义的动作被执行的次数。即 语句级触发器和行级触发器 。语句级触发器:是指当某触发事件发生时,该触发器只执行一次行级触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次

二 创建触发器

1 语法

CREATE [OR REPLACE ] TRIGGER trigger_name
	{BEFORE | AFTER}--前触发,后触发
	{INSERT | DELETE | UPDATE OF column [, column …]]}
	ON [schema.] table_name--表名
	[FOR EACH ROW]--行触发器
	[WHEN condition]--条件
	trigger_body;

每张表最多可建立12中类型的触发器,他们是:
在这里插入图片描述
2 触发器的触发次序
(1)执行 BEFORE 语句级 触发器
(2)对与受语句影响的每一行:
① 执行 BEFORE 行级 触发器
② 执行 DML 语句
③ 执行 AFTER 行级 触发器
(3) 执行 AFTER 语句级 触发器
3 创建DML触发器
触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。
触发器的限制
① CREATE TRIGGER 语句文本的字符长度不能超过 32KB
② 触发器体内的 SELECT 语句只能为 SELECT … INTO … 结构, 或者为定义游标所使用的 SELECT 语句 。
③ 触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;
④ 由触发器所调用的过程或函数也不能使用数据库事务控制语句;

问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值
实现
:NEW 修饰符访问操作完成后列的值
:OLD 修饰符访问操作完成前列的值
在这里插入图片描述
案例:建立一个触发器 , 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。

在这里插入图片描述
3 创建替代 (INSTEAD OF) 触发器
语法

CREATE [OR REPLACE] TRIGGER trigger_name
	INSTEAD OF
	{INSERT | DELETE | UPDATE [OF column [, column …]]}
	ON
	[schema.] view_name--视图名
	[FOR EACH ROW]
	[WHEN condition]
	trigger_body;
当省略 FOR EACH ROW 选项时, BEFORE 和 AFTER 触发器为语句触发器,而 INSTEAD OF 触发器则为行触发器。WHEN子句说明触发约束条件。 Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用 PL/SQL 函数。 WHEN 子句指 定的触发约束条件只能用在 BEFORE 和 AFTER 行触发器中,不能用在 
INSTEAD OF 行触发器和其它类型的触发器中。INSTEAD_OF 用于对视图的 DML 触发,由于视图有可能是由多个表进行联结 ( 而成,因而并非是所有的联结都是可更新的。但可以按照所需的方式执行更新,例如下面情况:
CREATE OR REPLACE VIEW emp_view AS
	SELECT deptno, count(*) total_employeer, sum(sal) total_salary
		FROM emp GROUP BY deptno;
在此视图中直接删除是非法:
SQL>DELETE FROM emp_view WHERE deptno=10;
DELETE FROM emp_view WHERE deptno=10
ERROR位于第 1 行
ORA01732: 此视图的数据操纵操作非法
但是可以创建 INSTEAD_OF 触发器来为 DELETE 操作执行所需的处理,即删除EMP 表中所有基准行:
CREATE OR REPLACE TRIGGER emp_view_delete
	INSTEAD OF DELETE ON emp_view FOR EACH ROW
BEGIN
	DELETE FROM emp WHERE deptno= :old.deptno;
END emp_view_delete;

DELETE FROM emp_view WHERE deptno=10;

DROP TRIGGER emp_view_delete;
DROP VIEW emp_view;

4 创建系统事件触发器
ORACLE 提供 的系统事件触发器可以在 DDL 或数据库系统上被触发。 DDL 指的是数据定义语言,如CREATE 、 ALTER 及 DROP 等。而数据库系统事件包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。创建系统触发器的语法如下:

CREATE OR REPLACE TRIGGER [sachema.] trigger_name
	{BEFORE|AFTER}
	--ddl_event_list:一个或多个DDL事件,用OR分开
	--database_event_list:一个或多个数据库事件,用OR分开
	{ddl_event_list | database_event_list}
	ON { DATABA SE | [schema.] SCHEMA }
	[WHEN_clause]
	trigger_body;

系统事件触发器既可以建立在一个模式上,又可以建立在整个数据库上 。当建立在模式 ( 之上时,只有模式所指定用户的 DDL 操作和它们所导致的错误才激活触发器 , 默认时为当前用户模式。当建立在数据库 DATABASE) 之上时,该数据库所有用户的 DDL 操作和他们所导致的错误,以及数据库的启动和关闭均可激活触发器。要在数据库之上建立触发器时,要求用户具有 ADMINISTER DATABASE TRIGGER 权限。
下面给出系统触发器的种类和事件出现的时机(前或后):
在这里插入图片描述
5 系统触发器事件属性
在这里插入图片描述
在这里插入图片描述
除DML 语句的列属性外,其余事件属性值可通过调用 ORACLE 定义的事件属性函数来读取。
在这里插入图片描述
6 使用触发器谓词
ORACLE 提供三个参数 INSERTING, UPDATING, DELETING 用于判断触发了哪些操作。
在这里插入图片描述
7 重新编译触发器
如果在触发器内调用其它函数或过程,当这些函数或过程被删除或修改后,触发器的状态将被标识为
无效。当 DML 语句激活一个无效触发器时, ORACLE 将重新编译触发器代码,如果编译时发现错误,这将导
致 DML 语句执行失败。
在PL/SQL 程序中可以调用 ALTER TRIGGER 语句重新编译已经创建的触发器,格式为:
ALTER TRIGGER [schema.] trigger_name C OMPILE [ DEBUG]
其中:DEBUG 选项要器编译器生成 PL/SQL 程序条使其所使用的调试代码。

三删除触发器

1 语法

DROP TRIGGER trigger_name;

当删除其他用户模式中的触发器名称,需要具有DROP ANY TRIGGER 系统权限,当删除建立在数据库上的触发器时,用户需要具有 ADMINISTER DATABASE TRIGGER 系统权限。此外,当删除表或视图时,建立在这些对象上的触发器也随之删除 。
2 触发器的状态
数据库TRIGGER 的状态
(1)有效状态( ENABLE):当触发事件发生时,处于有效状态的数据库触发器 TRIGGER 将被触发。
(2)无效状态( DISABLE):当触发事件发生时,处于无效状态的数据库触发器 TRIGGER 将不会被触发,此时就跟没有这个数据库触发器 (TRIGGER) 一样。
数据库TRIGGER 的这两种状态可以互相转换。格式为:
ALTER TIGGER trigger_name [DISABLE | ENABLE ];
例:ALTER TRIGGER emp_view_delete DISABLE;
ALTER T RIGGER 语句一次只能改变一个触发器的状态,而 ALTER TABLE 语句则一次能够改变与指定表相关的所有触发器的使用状态。格式为:
ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS;
例:使表EMP 上的所有 TRIGGER 失效:
ALTER TABLE emp DISABLE ALL TRIGGERS;

  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值