Home  >  Article  >  Database  >  Oracle触发器的使用

Oracle触发器的使用

WBOY
WBOYOriginal
2016-06-07 17:27:321092browse

与表或数据库事件联系在一起,当一个触发器事件发生时,定义在表上的触发器被触发执行。系统事件触发器可以在DDL或数据库系统上被

1、定义
 
触发器:与表或数据库事件联系在一起,当一个触发器事件发生时,定义在表上的触发器被触发执行。
 
触发器触发次序
 
1)执行 BEFORE语句级触发器;
 
2)对与受语句影响的每一行:
 
· 执行 BEFORE行级触发器
 
· 执行 DML语句
 
· 执行 AFTER行级触发器
 
3)执行 AFTER语句级触发器
 
2、DML触发器
 
触发类型--行级和表级
 
行级:触发语句处理每一行时,行级别触发器都激发一次。
 
通过:old访问原始值、:new访问修改后的值,:old和:new只在触发器内部有效。
 
触发时间--之前和之后
 

建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去
 
建立删除日志表
 
CREATE TABLE emp_his
 
AS SELECT * FROM EMP1 WHERE 1=2;
 
创建触发器
 
CREATE OR REPLACE TRIGGER del_emp
 
BEFORE DELETE OR UPDATE ON scott.emp1 FOR  EACH ROW
 
BEGIN
 
INSERT INTO emp_his(deptno , empno, ename , job ,mgr , sal , comm , hiredate )
 
VALUES( :old.deptno, :old.empno, :old.ename , :old.job,
 
:old.mgr, :old.sal, :old.comm, :old.hiredate );
 
END;
 
3、INSTEAD-OF触发器:
 
INSTEAD OF选项使Oracle激活触发器,而不执行触发事件
 
instead-of触发器只能定义在视图上,允许修改一个本来无法修改的视图。
 
可更改视图指:如果对视图的操作都是对基表的修改,并只有一个基表。
 
不可更改视图反之。
 
建立测试视图
 
CREATE OR REPLACE VIEW emp_view AS
 
SELECT deptno,COUNT(*) total_employee,SUM(sal) total_salary
 
FROM emp1 GROUP BY deptno;
 
--SELECT * FROM user_views;
 
对视图操作报错
 
DELETE FROM emp_view WHERE deptno=10;
 
建立替代触发器
 
CREATE OR REPLACE TRIGGER emp_view_delete
 
INSTEAD OF DELETE ON emp_view FOR EACH ROW
 
BEGIN
 
DELETE FROM emp1 WHERE deptno=:old.deptno;
 
END;
 
再次执行DELETE

linux

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn