oracle数据库开发与应用 触发器 18
oracle数据库开发与应用 触发器 18
智汇君oracle数据库开发与应用 触发器 18
1 | 以前对数据进行操作,都是直接对数据表进行操作,只需要遵守数据表自身的约束条件就可以了。但是,实际工程中的数据操作,其对数据完整性要求的复杂度远远不止于此。 |
1 | 例如,在数据库中,课程表内要插入一门课程,但是要求这门课程的任课教师不是符传谊。 |
使用触发器
1 | 触发器(TRIGGER),能够对数据操作、数据定义、系统事件进行校验、监控、记录,从而保证数据的完整性、提高数据库安全性。 |
1 | 最简单的触发器,定义语法如下: |
1 | 其中,BEFORE/AFTER:表示触发器触发时机。INSERT/UPDATE/DELETE:定义触发器面向的操作。比如,写INSERT,表示触发器在 INSERT操作前(或后)触发。当然,此操作可以定义为多种操作。对多种操作进行触发,方法是各种操作用OR关键字隔开。 |
1 | 1)关于:NEW.TEANO。 |
测试触发器
1 | 接下来测试触发器。向表TCOURSE中插人一门课程,任课教师为符传谊 |
1 | 在Oracle中有三类触发器: |
数据操作语言触发器
1 | 数据操作语言最常用的是INSERT、DELETE和UPDATE语句。由于数据操作语言面向的对象是表或者视图,所以数据操作语言触发器作用的对象是表或者视图。根据触发器面向的操作,触发器分为3种: |
用BEFORE触发器进行数据校验
1 | 行级触发器的特点是对表中每一行进行操作,都会触发这个触发器。如果一条语句对多行记录进行操作,就会多次触发这个触发器。 |
1 | UPDATE中数据的校验不仅可以对修改以后的数据进行校验,也可以校验修改 |
用 AFTER触发器进行级联操作
1 | 行级触发器的第二个作用是数据操作后进行级联操作,此时一般使用AFTER触发器。 |
1 | 实际上,触发器的触发时机BEFORE/AFTER对触发器的执行影响不大,不过为了提高运行效率、便于理解,建议使用和业务逻辑相符的触发时机。触发器的使用可能会使得整个数据库逻辑复杂,特别是级联操作,很可能造成数据库混乱,所以在实际工程中,使用时一定要谨慎。 |
语句级触发器
1 | 语句级触发器的特点是对数据操作的每一条语句,都会触发这个触发器,一条语句可能对多行记录进行操作,但是只触发一次这个触发器。 |
限制数据操作
记录操作日志
1 | 阶段性作业 |
INSTEAD OF触发器
1 | 在数据操作语言触发器中,还有一类特殊的触发器,叫做INSTEAD OF触发器(替代触发器)。之所以说它特殊,是因为之前讲到的数据操作语言触发器面向的对象是表或者视图,但是INSTEAD OF触发器只能应用于视图。 |
1 | 在讲解之前,首先来新建一个视图,保存每个教师的姓名和他们讲授的课程名称。 |
1 | 该视图使得课程名和教师姓名保存在同一个视图中,可以很方便地查询出这两个字段的对应关系。查询该视图,内容如图18-16所示。 |
1 | 这是因为:视图中的两个字段并不能保证是具有唯一性(或主键)约束的,如果直接操作,可能会造成同时对多行记录进行操作。所以在racle中,为了保证数据的一致性,对多表连接形成的视图,是不允许直接进行DML操作的。 |
1 | INSTEAD OF触发器可以解决这个问题 |
1 | INSTEAD OF触发器一旦触发,就会执行触发器中的代码,而本身的11DML操作将不会执行,这就是为什么它名为 INSTEAD OF 触发器的原因。 |
数据定义语言触发器
1 | 数据定义语言(DDL)触发器主要用于监视数据库中用户的一些重要操作,如表建立、删除等。 |
1 | 这里的用户事件主要包括CREATE、ALTER、DROP等命令、用户登录LOGIN等。 |
触发器和其他数据库对象的关系
1 | 触发器也可以调用存储过程,实际上,触发器是一种特殊的存储过程,它的结构函数和过程基本相同,但是它又有自己的特点: |




















