触发器是特定事件出现的时候,自动执行的代码块。类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
1.触发器组成:
触发事件:引起触发器被触发的事件。 例如: DML 语句 (INSERT, UPDATE, DELETE 语句对表或视图执行数据处理操作 ) 、 DDL 语句(如 CREATE 、 ALTER 、 DROP 语句在数据库中创建、修改、删除模式对象)、数据库系统事件(如系统启动或退出、异常错误)、用户事件(如登录或退出数据库)。
触发时间:即该 TRIGGER 是在触发事件发生之前( BEFORE )还是之后 (AFTER) 触发,也就是触发事件和该 TRIGGER 的操作顺序。
触发操作:即该 TRIGGER 被触发之后的目的和意图,正是触发器本身要做的事情。 例如: PL/SQL 块。
触发对象:包括表、视图、模式、数据库。只有在这些对象上发生了符合触发条件的触发事件,才会执行触发操作。
触发条件:由 WHEN 子句指定一个逻辑表达式。只有当该表达式的值为 TRUE 时,遇到触发事件才会自动执行触发器,使其执行触发操作。
触发频率:说明触发器内定义的动作被执行的次数。即语句级 (STATEMENT) 触发器和行级 (ROW) 触发器。
2. 触发器的类型:
语句级 (STATEMENT) 触发器:是指当某触发事件发生时,该触发器只执行一次;
行级 (ROW) 触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。
DML触发器 : ORACLE 可以在 DML 语句进行触发,可以在 DML 操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。
替代触发器 :由于在 ORACLE 里,不能直接对由两个以上的表建立的视图进行操作。所以给出了替代触发器。它就是 ORACLE 8 专门为进行视图操作的一种处理方法。
系统触发器 : ORACLE 8i 提供了第三种类型的触发器叫系统触发器。它可以在 ORACLE 数据库系统的事件中进行触发,如 ORACLE 系统的启动与关闭等。
3. 创建触发器的一般语法:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
REFERENCING 子句说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新、旧列值,默认的相关名称分别为OLD和NEW。触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。 不同类型的触发器 ( 如 DML 触发器、 INSTEAD OF 触发器、系统触发器 ) 的语法格式和作用有较大区别。
4.dml触发器示例 : 限定只对部门号为80的记录进行行触发器操作
CREATE
OR
REPLACE
TRIGGER
tr_emp_sal_comm
BEFORE
UPDATE
OF
salary, commission_pct
OR
DELETE
ON
HR.employees
FOR
EACH ROW
WHEN
(old.department_id
=
80
)
BEGIN
CASE
WHEN
UPDATING (
'salary'
)
THEN
IF
:NEW.salary
<
:old.salary
THEN
RAISE_APPLICATION_ERROR(
-
20001
,
'
部门
80
的人员的工资不能降
'
);
END
IF
;
WHEN
UPDATING (
'commission_pct'
)
THEN
IF
:NEW.commission_pct
<
:old.commission_pct
THEN
RAISE_APPLICATION_ERROR(
-
20002
,
'
部门
80
的人员的奖金不能降
'
);
END
IF
;
WHEN
DELETING
THEN
RAISE_APPLICATION_ERROR(
-
20003
,
'
不能删除部门
80
的人员记录
'
);
END
CASE
;
END
;