oracle数据库之触发器
触发器是许多关系数据库系统都提供的一项技术。在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块。
一、 触发器类型
(一) DML 触发器
ORACLE 可以在 DML 语句进行触发,可以在 DML 操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
(二) 替代触发器
由于在 ORACLE 里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。
(三)系统触发器
它可以在 ORACLE 数据库系统的事件中进行触发,如 ORACLE 系统的启动与关闭等。
二、触发器组成
触发事件:即在何种情况下触发 TRIGGER; 例如:INSERT, UPDATE, DELETE。
触发时间:即该 TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该 TRIGGER 的操作顺序。
触发器本身:即该 TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。例如:PL/SQL 块。
触发频率:说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次;行级(ROW)触发器是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
三、 创建触发器
创建触发器的一般语法是:
- 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;
其中:
BEFORE 和 AFTER 指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器;
FOR EACH ROW 选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个 DML 语句操做影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略 FOR EACH ROW 选项时,BEFORE 和 AFTER 触发器为语句触发器,而 INSTEAD OF 触发器则为行触发器。
WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用 PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在 BEFORE 和 AFTER 行触发器中,不能用在 INSTEAD OF 行触发器和其它类型的触发器中。
当一个基表被修改( INSERT, UPDATE, DELETE)时要执行的存储过程,执行时根据其所依附的基表改动而自动触发,因此与应用程序无关,用数据库触发器可以保证数据的一致性和完整性。每张表最多可建立 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
(一) 触发器触发次序
1、执行 BEFORE 语句级触发器
对与受语句影响的每一行
2、执行 BEFORE 行级触发器
3、执行 DML 语句
3、执行 AFTER 行级触发器
4、执行 AFTER 语句级触发器
(二) 创建 DML 触发器
触发器名可以和表或过程有相同的名字,但在一个模式中触发器名不能相同。
触发器的限制
l CREATE TRIGGER 语句文本的字符长度不能超过 32KB;
l 触发器体内的 SELECT 语句只能为 SELECT … INTO …结构,或者为定义游标所使用的 SELECT 语句。
l 触发器中不能使用数据库事务控制语句 COMMIT; ROLLBACK, SVAEPOINT 语句;
l 由触发器所调用的过程或函数也不能使用数据库事务控制语句;
问题:当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、 后
例 1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。
(三) 创建替代(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;
其中:
BEFORE 和 AFTER 指出触发器的触发时序分别为前触发和后触发方式,前触发是在执行触发事件之前触发当前所创建的触发器,后触发是在执行触发事件之后触发当前所创建的触发器。INSTEAD OF 选项使 ORACLE 激活触发器,而不执行触发事件。只能对视图和对象视图建立 INSTEAD OF触发器,而不能对表、模式和数据库建立 INSTEAD OF 触发器。
FOR EACH ROW 选项说明触发器为行触发器。行触发器和语句触发器的区别表现在:行触发器要求当一个 DML 语句操做影响数据库中的多行数据时,对于其中的每个数据行,只要它们符合触发约束条件,均激活一次触发器;而语句触发器将整个语句操作作为触发事件,当它符合约束条件时,激活一次触发器。当省略 FOR EACH ROW 选项时,BEFORE 和 AFTER 触发器为语句触发器,而 INSTEAD OF 触发器则为行触发器。
WHEN 子句说明触发约束条件。Condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用 PL/SQL 函数。WHEN 子句指定的触发约束条件只能用在 BEFORE 和 AFTER 行触发器中,不能用在 INSTEAD OF 行触发器和其它类型的触发器中。
INSTEAD_OF 用于对视图的 DML 触发,由于视图有可能是由多个表进行联结(join)而成,因而并非是所有的联结都是可更新的。但可以按照所需的方式执行更新,例如下面情况:
- 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 行:
ORA-01732: 此视图的数据操纵操作非法
但是可以创建 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;
(四)创建系统事件触发器
ORACLE 提供的系统事件触发器可以在 DDL 或数据库系统上被触发。DDL 指的是数据定义语言,如CREATE 、ALTER 及 DROP 等。而数据库系统事件包括数据库服务器的启动或关闭,用户的登录与退出、数据库服务错误等。创建系统触发器的语法如下:
创建触发器的一般语法是:
- CREATE OR REPLACE TRIGGER [sachema.] trigger_name
- {BEFORE|AFTER}
- {ddl_event_list | database_event_list}
- ON { DATABASE | [schema.] SCHEMA }
- [WHEN_clause]
- trigger_body;
其中: ddl_event_list:一个或多个 DDL 事件,事件间用 OR 分开;
database_event_list:一个或多个数据库事件,事件间用 OR 分开;
系统事件触发器既可以建立在一个模式上,又可以建立在整个数据库上。当建立在模式(SCHEMA)之上时,只有模式所指定用户的 DDL 操作和它们所导致的错误才激活触发器, 默认时为当前用户模式。当建立在数据库(DATABASE)之上时,该数据库所有用户的 DDL 操作和他们所导致的错误,以及数据库的启动和关闭均可激活触发器。要在数据库之上建立触发器时,要求用户具有 ADMINISTER DATABASE TRIGGER 权限。
下面给出系统触发器的种类和事件出现的时机(前或后):
(五) 使用触发器谓词
ORACLE 提供三个参数 INSERTING, UPDATING, DELETING 用于判断触发了哪些操作。
(六) 重新编译触发器
如果在触发器内调用其它函数或过程,当这些函数或过程被删除或修改后,触发器的状态将被标识为无效。当 DML 语句激活一个无效触发器时,ORACLE 将重新编译触发器代码,如果编译时发现错误,这将导致 DML 语句执行失败。
在 PL/SQL 程序中可以调用 ALTER TRIGGER 语句重新编译已经创建的触发器,格式为:
- ALTER TRIGGER [schema.] trigger_name COMPILE [ DEBUG]
其中:DEBUG 选项要器编译器生成 PL/SQL 程序条使其所使用的调试代码。
四、 删除和使能触发器
(一)删除触发器:
- DROP TRIGGER trigger_name;
当删除其他用户模式中的触发器名称,需要具有 DROP ANY TRIGGER 系统权限,当删除建立在数据库上的触发器时,用户需要具有 ADMINISTER DATABASE TRIGGER 系统权限。
此外,当删除表或视图时,建立在这些对象上的触发器也随之删除。
1、 触发器的状态
有效状态(ENABLE):当触发事件发生时,处于有效状态的数据库触发器 TRIGGER 将被触发。
无效状态(DISABLE):当触发事件发生时,处于无效状态的数据库触发器 TRIGGER 将不会被触发,此时
就跟没有这个数据库触发器(TRIGGER) 一样。
数据库 TRIGGER 的这两种状态可以互相转换。格式为:
- ALTER TIGGER trigger_name [DISABLE | ENABLE ];
例:
- ALTER TRIGGER emp_view_delete DISABLE;
ALTER TRIGGER 语句一次只能改变一个触发器的状态,而 ALTER TABLE 语句则一次能够改变与指定表相关的所有触发器的使用状态。格式为:
- ALTER TABLE [schema.]table_name {ENABLE|DISABLE} ALL TRIGGERS;
例:使表 EMP 上的所有 TRIGGER 失效:
- ALTER TABLE emp DISABLE ALL TRIGGERS;
oracle数据库之触发器的更多相关文章
- Oracle数据库之触发器(一)
触发器trigger是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发.比如当对一个表进行操作(in ...
- Oracle数据库之触发器(二)
DML触发器是指在进行insert.update或delete操作时触发的程序体.如果你想在用户对数据进行操作时,记录或限制其操作,就可以用DML触发器.举例来说,我想统计我的网站用户的注册.注销或者 ...
- [转帖] Oracle数据库 通过触发器 限制登录ip
转帖 From https://yq.aliyun.com/ziliao/123360 create or replace trigger logon_ip_control after logon o ...
- Oracle数据库——触发器的创建与应用
一.涉及内容 1.理解触发器的概念.作用和类型. 2.练习触发器的创建和使用. 二.具体操作 (实验) 1.利用触发器对在scott.emp表上执行的DML操作进行安全性检查,只有scott用户登录数 ...
- oracle数据库高级应用之《触发器的建立》
(一)oracle数据库触发器的建立 eg1 CREATE OR REPLACE TRIGGER TRIGGER_ON_TD_DEPARTMENT AFTER INSERT OR UPDATE OR ...
- Oracle数据库之PL/SQL触发器
Oracle数据库之PL/SQL触发器 1. 介绍 触发器(trigger)是数据库提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是 ...
- oracle数据库触发器(trigger)用法总结
from:http://blog.csdn.net/zhanzhib/article/details/48729417 触发器的意思就是当我们对数据库对象(一般是表或视图)进行insert.updat ...
- Oracle数据库触发器使用(删除触发)
当我们需要用到触发器的时候,还是很方便,你会指定当我在操作某一事件时触发效果完成我所希望完成的事情:这就是触发器, 下面我给大家上一串代码,这是一个当我在操作删除事件操作时候,我希望把即将删除那条数据 ...
- Oracle数据库 常用的触发器命令
创建自增序列,创建触发器(在触发时间中操纵序列,实现主键自增): Oracle数据库不支持自增方法 create sequence seq_userInfo_usid start with ;--创建 ...
随机推荐
- JavaSE环境下的shiro(源自腾讯课堂)
Shiro作用: 认证(登录).授权(鉴权).加密(用户名/密码加密).会话管理(session).Web集成.缓存 apache官网可以下载 图一 图二 图三 图一 .二是配置文件内容,对于图三的: ...
- Python入门 —— 02基础语法
基础语法入门学习推荐: 简明 Python 教程 下文仅为入门推荐书籍的补充与重点 多行语句:末尾使用斜杠 ( ) ,将一行分为多行 var = item1 + item2 + item3 注释: ...
- Java 面试题 百度/参考的答案
"a=b"和"a.equals(b)"有什么区别? 如果 a 和 b 都是对象,则 a==b 是比较两个对象的引用,只有当 a 和 b 指向的是堆中的同一个对象 ...
- 使用NPOI将数据导出Excel
NPOI.HSSF.UserModel.HSSFWorkbook book = new NPOI.HSSF.UserModel.HSSFWorkbook(); NPOI.SS.UserModel.IS ...
- Python在线编程环境
除了安装Python的IDE之外,也可以使用在网页中随时随地编写Python程序. Python官网:https://www.python.org/shell Python123:https://py ...
- AtCoder Regular Contest 100 E - Or Plus Max
一道很好的dp题 dp[K]存的是 i满足二进制1属于K二进制1位置 最大的两个Ai 这样dp[K]统计的两个数肯定满足(i | j) <= K 然后不断做 update(dp[i | (1&l ...
- .Net 面试题 汇总(六)
一.填空题 1.面向对象的语言具有(继承)性.(多态)性.(封装)性. 2.能用foreach遍历访问的对象需要实现 (IEnumberable)接口或声明(GetEnumberator)方法的类型. ...
- Speed Up Your WordPress Site
http://www.sitepoint.com/speed-wordpress/ http://www.sparringmind.com/speed-up-wordpress/ http://www ...
- Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)
Caliburn.Micro 杰的入门教程1(翻译)Caliburn.Micro 杰的入门教程2 ,了解Data Binding 和 Events(翻译)Caliburn.Micro 杰的入门教程3, ...
- 北京Uber优步司机奖励政策(12月19日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...