Oracle_触发器讲解解析
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
触发事件是在数据库表上执行的DML(INSERT、UPDATE、 DELETE)操作。使用触发器,可以做许多事情,包括: ● 维护不可能在表创建时通过说明性约束进行的复杂 的完整性约束限制。 ● 通过记录所进行的修改以及谁进行了修改来审计表 中的信息。 ●当表被修改的时候,自动给需要执行操作的程序发信号 。
1.触发器概念及组成
制作一个数据库触发器,目的是在某个表上执行特定的 数据维护操作时,隐含地执行一个PL/SQL块。
例子:制作一个数据库触发器。记录下那些超过其工种工 资范围的工资值(但不禁止这种操作) CREATE TRIGGER check_sal BEFORE INSERT OR UPDATE OF sal,job ON emp FOR EACH ROW WHEN(new.job<> ‘PRESIDENT’) DECLAER v_minsal sal_guide.minsal%TYPE; v_maxsal sal_guide.maxsal%TYPE; e_sal_out_of_range EXCEPTION;
触发器
触发器类似于过程、函数,因为它们都是拥有说明部 分、语句执行部分和异常处理部分的有名的PL/SQL块。与 包类似,触发器必须存储在数据库中,并且不能被块进行 本地化说明。但是,对于过程而言,可以从另一个块中通 过过程调用显式地执行一个过程,同时在调用时可以传递 参数。对于触发器而言,当触发事件发生时就会显式地执 行该触发器,并且触发器不接受参数。
注释:
· 参数MAXOPENCURSORS限制在一个数据库中可用 的关联触发器的个数,其缺省值为32。
★ 写触发器的源代码之前,先确定好其触发时间、触发事 件及触发器的类型。 内容 触发时间 触发事件 描述 与触发事件的时间次序 触发触发器的数据操作 事件类型 触发器体被执行的次数 可能值 ● BEFORE ● AFTER ● INSERT ● UPDATE ● DELETE ● Statement ● ROW 完整的 PL/ SQL块
BEGIN SELECT minsal,maxsal INTO v_minsal,v_maxsal FROM sal_guide WHERE job = :new. job; IF :new.sal<v_minsal OR :new:sal>v_maxsal THEN RAISE e_sal_out_of_range; END IF; EXCEPTION WHEN e_sal_out_of_range THEN INSERT INTO audit_message(line_nr,line) VALUES(l,‘Salary’|| TO_CHAR(:new.sal)|| ‘is out of range for employee’||TO_CHAR(:new.empno)); END;
SQL> DELETE FROM EMP 2 WHERE DEPTNO=10;
2.创建触发器
⑴ 开发触发器的步骤
●用系统编辑器或字处理软件写一个含有 CREATE TRIGGER语句的脚本文件。 ●在写 CREATE TRIGGER语句时,充分考虑运行时出 错的处理。 ●在 SQL*Plus或 SVRMGR中运行脚本文件,将触发器的 源代码编译成编译代码p_code,并把源代码存储到数据 库中。编译代码p_code不存储在数据库中。 ●调试编译错误。 ●在 ORACLE环境中测试开发的触发器(用INSERT、 UPDATE、DELETE语句对表进行操作)。 ●在运行期间调试触发器的逻辑错误。
触发器类型
触发器体
该触发器将要执行的动作
★ 行级触发器与语句级触发器的区别 根据进行一个操作时触发器的触发次数,来决定是创建 一个语句级触发器,还是创建一个行级触发器。 ● 注意当某操作只影响到表中的一行数据时,语句级触 发器与行级触发器的效果相同。
例子:下面的语句对语句级触发器和行级触发器效果一样
⑵ 语句级触发器
用 CREATE TRIGGBR语句创建一个语句级触发器,该触 发器在一个数据操作语句发生时只触发一次。
语法——创建一个语句级触发器 CREATE [OR REPLACE ] TRIGGER trigger_name {BEFORE|AFTER} event1 [OR event2...] ON table_name PL/SQL block
其中: trigger name timing
event
table name pl/sql block
触发器名 指明触发事件触发的时间顺序: ● BEFORE ● AFTER 指明触发事件的数据操纵类型 ● INSERT ● UPDATE ● DELETE 标明与该触发器相关联的表名 触发器体,指明该触发器将执行的操 作
例子----下列语句的行级触发器与语句级触发器效果不同 SQL>INSERT INTO EMP(empno,ename) 2 SELECT empno,ename 3 FROM EMP_BACKUP;
SQL> UPDATE DEPT 2 SET SAL= SAL*1.1 3 WHERE DEPTNO=10;
★ 关联触发器 把一个数据库触发器的动作与另一个触发器联系 起中统计 审计信息的总数
CREATE TRIGGER count_audit_message BEFORE INSERT ON audit_message BEGIN emp_package.v_total_audit:=emp_package.v_total_audit+1; END;
SQL> INSERT INTO DEPT(deptno,dname) VALUES(50,‘EDUCATION’); SQL> UPDATE DEPT SET LOC=‘MAUI’ WHERE DEPTNO=50;
SQL> DELETE FROM DEPT WHERE DEPTNO=50;
●当触发事件影响数据库的多行时,语句级触发器只触 发一次,而行级触发器则每一行被触发一次。