您的位置:首页 > 数据库 > Oracle

oracle触发器详解

2015-04-15 09:21 127 查看
触发器就是一种可以在数据库中触发事件的代码

触发器必须由事件才能触发 触发器的触发事件分3类



分别是DML事件 DDL事件 和数据库事件



触发器的定义位置

DML触发器(数据操作触发器):创建在表上由DMl事件引发的触发器

DDL触发器(数据定义语言触发器):定义在模式上 触发事件是数据库对象的创建修改

数据库事件触发器:定义在整个数据库或者模式上触发事件是数据库事件

DML触发器

DML触发器是定义在表上的触发器 由DML事件引发编写DML触发器的要素是:

1.确定触发的表,即定义触发器的表

2.确定触发事件,DML的触发事件有 insert、update 和delete

3.确定触发的时间,触发时间有 BEFORE 和 After两种

[b]BEFORE代表DML语句执行之前触发[/b]

[b]After代表DML语句执行之后触发[/b]

4.语句级触发器和行级触发器



语句级触发器表示只触发一次的触发器 行级触发器表示每执行一行就触发一次的触发器

在行级触发器中 用:new 和:old 来访问数据变更前后的值

但要注意 insert语句插入一条新纪录 所以所以没有:old记录,而DELETE语句删除掉一条已经存在的记录,所以没有:new记录。UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。

具体的语法:

:old.字段名

:new.字段名

触发器的创建:

CREATE OR REPLACE TRIGGER
触发器名



([b]OR REPLACE代表有相同名字的触发器就覆盖)[/b]

BEFORE|AFTER

INSERT|UPDATE|DELETE [OR 触发事件2 OR触发事件3]

ON 要触发的表名

[FOR EACH ROW|WHEN]

BEGIN

触发后要执行的语句

END;

下面给几个实例:

1. 创建一个行级触发器LOG_SAL,记录对职务为CLERK的雇员工资的修改,且当修改幅度超过200时才进行记录。用WHEN条件限定触发器。

首先要有个表 EMP



如图












然后打开SQL 输入如下代码

CREATE OR REPLACE TRIGGER log_sal
BEFORE
UPDATE OF sal ON emp FOR EACH ROW
when (new.job='CLERK' AND (ABS(new.sal-old.sal)>200))
DECLARE
v_no NUMBER;
BEGIN
SELECT COUNT(*) INTO v_no FROM logerr;
INSERT INTO logerr VALUES(v_no+1,'雇员'||:new.ename||'的原工资:'||:old.sal||'新工资:'||:new.sal);
END;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: