【Oracle】触发器

触发器的简介

触发器是一种特殊类型的存储过程,其基本定义形式与存储过程和函数类似,唯一不同的就是所有的存储过程和函数均需用户显示调用,而触发器是当某个特定事件发生时,由系统自动调用执行,不能接收参数,即触发器是自动隐式运行的。特定事件通常是指对数据库对象的某个操作,如对数据库表进行的DML操作或对视图进行的类似操作,同时Oracle还将触发器的功能扩展到对如数据库的启动与关闭等事件的触发,所以触发器常用来完成数据库完整性约束难以完成的复杂业务规则的约束,或监视对数据库的各种操作。

  1. 触发器的组成
  • 触发事件:引起触发器被触发的事件,如DML语句、DDL语句、数据库系统事件(如系统启动或退出及异常错误等)、用户事件(如登录或退出数据库)等。
  • 触发时间:指该触发器是在触发事件发生前(BEFFORE)还是之后(AFTER)触发,也就是触发事件和该触发器的操作顺序。
  • 触发操作:即触发器被触发之后执行的PL/SQL块。
  • 触发对象:包括表、视图、模式、数据库。这有这些对象上发生了符合条件的触发事件时,才会执行触发操作。
  • 触发条件:由WHEN子句指定的一个逻辑表达式子。只有当该表达式的值为TURE时,遇到触发事件才会自动执行触发操作。
  • 触发频率:说明触发器内定义的动作被执行的次数,即语句级触发器和行级触发器。
  1. 编写触发器时的注意事项
  • 触发器不接收任何参数,并且只能是在产生了某一触发事件之后才会自动调用。
  • 一个数据表最多只能有12个触发器(语句级、行级、BEFRORE、AFTER和DML操作的组合);同一时间、同一事件、同一类型的触发器只能有一个,并且触发器之间不能有矛盾。
  • 一个触发器最大为32KB,所以如果需要编写的代码较多,可以通过过程或函数调用完成。
  • 默认情况下,触发器不能使用事务级处理操作。因为触发器是触发语句的一部分,触发语句被提交、回退时,触发器也被提交、回退。
  • 一个表上的触发器越多,对在该表上的DML操作的性能影响就越大。
  • 在触发器的执行部分只能使用DML语句,不能使用DDL语句。
  • 在触发器主体中不能申明任何LONG和BLOB变量。
  • 不同类型的触发器(如DML触发器、INSTEAD-OF触发器、系统触发器)的语法格式和作用有较大区别。
  1. 触发器的分类
  • DML触发器:建立在基本表上的触发器,相应基本表的INSERT、UPDATE、DELETE操作。
  • 替代触发器(INSTEAD-OF触发器):建立在视图上的触发器,响应视图上的INSERT、UPDATE、DELETE操作。
  • 系统触发器:建立在数据库系统和模式对象上的触发器,响应模式对象的CREATE\ALTER、DROP、GRANT等DDL操作,以及响应数据库服务的打开、关闭、错误等系统事件,或监控用户的行为操作。

DML触发器

DML触发器主要由DML语句进行触发,当用户对表进行了增加、修改、删除操作时出触发。
````语法```

CREATE [OR REPLACE] TRIGGER 触发器名称
	[BEFORE|AFTER] 
	[INSERT|DELETE|UPDATE[OF列名称[,列名称...]]
	ON 表名称
	[FOR EACH ROW]
	[FOLLOWS 触发器名称]
	[DISABLE]
	[WHEN 触发条件]
[DECLARE]
	[程序声明部分;]
BEGIN
	程序代码部分;
END [触发器名称];
  • BEFORE|AFTER:指出触发器的触发时间是前触发还是后触发,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器;
  • INSERT|DELETE|UPDATE [OF 列名称]:表示触发的事件,包括对表的增删改操作;
  • FOR EACH ROW:表示定义行级触发器,若省略则表示定义语句级触发器;
  • FOLLOWS:用于指定配置多个触发器时执行的先后次序;
  • DISABLE:表示触发器的启用状态,默认启用,若使用此选项定义为禁用状态;
  • WHEN触发条件:在行级触发器中,用来控制触发器是否被执行的一个控制条件。

触发器的分类

DML触发器根据触发的频率可以分为两类:
语句级(STATEMENT)触发器:是将整个DML语句操作作为触发事件,在DML操作之前或之后进行触发操作,并且只会触发一次。
行级(ROW)触发器:是指当一个DML语句操作影响数据库中的多行数据时,对于其中的每个数据行,只要他们符合触发约束条件,均激活一次触发器;行级触发器需要使用FOR EACH ROW选项。

  1. 语句级DML触发器
    示例:创建一个针对EMP表的语句级DML触发器,要求在非工作时间禁止对EMP表进行DML操作
CREATE OR REPLACE TRIGGER trig_emp_dml
  BEFORE INSERT OR UPDATE OR DELETE ON scott.emp
BEGIN
  IF (TO_CHAR(SYSDATE,'DAY') IN ('星期六', '星期日')) 
    OR (TO_CHAR(SYSDATE, 'HH24:MI') NOT BETWEEN '08:30' AND '17:30') THEN
    RAISE_APPLICATION_ERROR(-20002, '只能在工作时间进行操作。');
  END IF;
END trig_emp_dml;
  1. 行级触发器
    创建需要使用FOR EACH ROW选项。由于行触发器是基于行级别的,因此可以对当前正在处理的行记录数据进行访问。
    伪记录“:NEW”和“:OLD”用来实现对当前行记录数据的访问。
    “:NEW.字段”访问操作完成后列的值(新值);
    “:OLD.字段”访问操作完成前列的值(旧值)。
    在不同触发器事件中,“:NEW.字段”和“:OLD.字段”的意义不同。

在这里插入图片描述

触发器谓词

如果触发器响应了多个DML事件,并且需要根据不同的DML事件进行不同的操作,则可以在触发器中使用以下3个触发器谓词:
INSERTING:如果触发事件为INSERT,该触发器谓词返回TRUE,否则返回FALSE;
UPDATING:如果触发事件为UPDATE,该触发器谓词返回TRUE,否则返回FALSE;
DELETING:如果触发事件为DELETE,该触发器谓词返回TRUE,否则返回FALSE。

触发器的执行顺序

语句级触发器和行级触发器按照触发时间(BEFORE和AFTER)不同,又分为语句级前触发器(BEFORE STATEMENT)、语句级后触发器(AFTER STATEMENT)、行级前触发器(BEFORE ROW)、行级后触发器(AFTER ROW)4类。
当用户执行更新操作时,这4类触发器的执行顺序为“语句级前触发器→行级前触发器→更新操作→行级后触发器→语句级后触发器”。

系统触发器

是建立在数据库或模式之上的触发器,触发事件包括DDL事件和数据库事件。DDL事件是指创建、修改或删除数据库模式对象的事件。系统触发器用于对这些数据库模式对象的DDL操作进行监控。
常用的DDL触发事件及触发时间。
在这里插入图片描述
数据库事件是指Oracle数据库系统运行过程中产生的事件,如系统的启动与关闭等。系统触发器通过数据库事件来监视数据库服务的打开、关闭以及错误等信息的获取,或者监控用户的行为操作等。
常用的数据库触发事件及触发时间。
在这里插入图片描述
系统触发器的创建语法

CREATE [OR REPLACE] TRIGGER 触发器名称
	BEFORE|AFTER DDL事件|数据库事件 
	ON SCHEMA|DATABASE
	[WHEN 触发条件]
[DECLARE]
	[程序声明部分;]
BEGIN
	程序代码部分;
END [触发器名称];

其中:

  • ON SCHEMA:表示对一个具体模式的触发,每个用户都可以直接创建;
  • ON DATABASE:表示对数据库级的触发,需要管理员权限才可以创建。

在根据触发事件编写触发器时,通常需要获取一些系统的信息,例如,当前操作对象名称、操作用户、数据库信息等,此时可以使用Oracle的DBMS_STANDARD包中定义的一些事件属性函数
常用的事件属性函数
在这里插入图片描述
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值