Professional Documents
Culture Documents
MC01 Oracle 触发器
MC01 Oracle 触发器
MC01 Oracle 触发器
课程目标
• 触发器的组成
• 创建 DML 触发器
• 创建替代触发器
• 创建系统事件触发器
• 创建用户事件触发器
• 重编译触发器
触发器
触发器是一种在发生数据库
事件时自动运行的 PL/SQL 代码块,
在一般情况下它与特定表上的 DML 操
作相关联。注意触发器与数据库中其
他过程的区别,过程或函数都由用户
直接调用,而触发器的执行用户则不
能直接调用。 Oracle 会在相应的事件
发生时,自动调用触发器。
触发器的组成结构
注意:
UPDATE 的操作可以看成 DELETE 和 INSERT 的两次操
作。
:NEW 和 :OLD 仅用在于行级触发器,不适用与语句级
触发器( why ?)
练习
创建触发器,使得当部门被修改,对修改前的
部门数据做备份,备份时要记录操作类型,和
操作时间。
需要先创建备份表 DETP_BAK:
CREATE TABLE DEPT_BAK
AS SELECT * FROM DEPT WHERE 1=2
增加“备份类型”和“备份时间”字段:
alter table DEPT_BAK add (
BAK_TYPE varchar(100),
BAK_TIME TIMESTAMP
)
练习
在 PL/SQL Developer 中打开一个程序窗口(不是 SQL 窗口
, SQL 窗口中看不到编译的错误信息),在窗口中写如下的语
句,并执行:
使用替代触发器的一个常用情形是对视图的操作:
如果一个视图由多个基表进行连接而成的,当这种操
作是同时影响到 2 个基表以上时,视图不允许用户进行
insert 、 update 和 delete 的操作。
如果我们要进行上述的操作,则必须将 DML 操作
定义在替代触发器中分别对各个基表进行操作。
因此,使用 DML 触发器一般是定义在表上,而替代
触发器一般是定义在视图上。
替代 (INSTEAD OF) 触发器
• 创建一个 INSTEAD OF 触发器语法:
create [or replace] trigger 触发器名
instead of
触发事件 { insert | delete | update [of column, …] }
on { 视图名 | 表名? }
[for each row]
[ when condition]
begin
pl/sql 语句 ;
end;
经测试,在 Oracle10G 上不能在表上创建替代触发器。
系统事件触发器
系统事件触发器是指由数据库系统事
件触发的数据库触发器。数据库系统事件
包括如下几种:
• 数据库的启动 (startup)
• 数据库的关闭 (shutdown)
• 数据库服务器的出错 (servererror)
注意:系统事件触发器不是与特定的表或
视图关联。
系统事件触发器定义
• 创建一个系统事件触发器
create [or replace] trigger 触发器名
{ before | after }
{ database_event_list }
on { database | schema }
begin
pl/sql 语句 ;
end;
系统事件触发示例
• 例子:创建一个系统事件触发器,记录系统每次
的启动时间:
create table database_log(op_date timestamp);
• 例子:创建一个用户事件触发器,记录用户登录系
统的用户名与时间
create table login(who varchar2(20),log
timestamp);
删除触发器:
DROP TRIGGER 触发器名