`
maosheng
  • 浏览: 550284 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle 触发器详解 5

阅读更多
8.6 数据库触发器的应用实例
  用户可以使用数据库触发器实现各种功能:
  复杂的审计功能;
  例:将EMP 表的变化情况记录到AUDIT_TABLE和AUDIT_TABLE_VALUES中。
CREATE TABLE audit_table(
Audit_id NUMBER,
User_name VARCHAR2(20),
Now_time DATE,
Terminal_name VARCHAR2(10),
Table_name VARCHAR2(10),
Action_name VARCHAR2(10),
Emp_id NUMBER(4));

CREATE TABLE audit_table_val(
Audit_id NUMBER,
Column_name VARCHAR2(10),
Old_val NUMBER(7,2),
New_val NUMBER(7,2));

CREATE SEQUENCE audit_seq
START WITH 1000
INCREMENT BY 1
NOMAXVALUE
NOCYCLE NOCACHE;

CREATE OR REPLACE TRIGGER audit_emp
AFTER INSERT OR UPDATE OR DELETE ON emp
FOR EACH ROW
DECLARE
Time_now DATE;
Terminal CHAR(10);
BEGIN
Time_now:=sysdate;
Terminal:=USERENV('TERMINAL');
IF INSERTING THEN
INSERT INTO audit_table
VALUES(audit_seq.NEXTVAL, user, time_now,
terminal, 'EMP', 'INSERT', :new.empno);
ELSIF DELETING THEN
INSERT INTO audit_table
VALUES(audit_seq.NEXTVAL, user, time_now,
terminal, 'EMP', 'DELETE',ld.empno);
ELSE
INSERT INTO audit_table
VALUES(audit_seq.NEXTVAL, user, time_now,
terminal, 'EMP', 'UPDATE',ld.empno);
IF UPDATING('SAL') THEN
INSERT INTO audit_table_val
VALUES(audit_seq.CURRVAL, 'SAL',ld.sal, :new.sal);
ELSE UPDATING('DEPTNO')
INSERT INTO audit_table_val
VALUES(audit_seq.CURRVAL, 'DEPTNO',ld.deptno, :new.deptno);
END IF;
END IF;
END;
  增强数据的完整性管理;
  例:修改DEPT表的DEPTNO列时,同时把EMP表中相应的DEPTNO也作相应的修改;
CREATE SEQUENCE update_sequence
INCREMENT BY 1
START WITH 1000
MAXVALUE 5000 CYCLE;

ALTER TABLE emp
ADD update_id NUMBER;

CREATE OR REPLACE PACKAGE integritypackage AS
Updateseq NUMBER;
END integritypackage;

CREATE OR REPLACE PACKAGE BODY integritypackage AS
END integritypackage;

CREATE OR REPLACE TRIGGER dept_cascade1
BEFORE UPDATE OF deptno ON dept
DECLARE
Dummy NUMBER;
BEGIN
SELECT update_sequence.NEXTVAL INTO dummy FROM dual;
Integritypackage.updateseq:=dummy;
END;

CREATE OR REPLACE TRIGGER dept_cascade2
AFTER DELETE OR UPDATE OF deptno ON dept
FOR EACH ROW
BEGIN
IF UPDATING THEN
UPDATE emp SET deptno=:new.deptno,
update_id=integritypackage.updateseq
WHERE emp.deptno=:old.deptno AND update_id IS NULL;
END IF;
IF DELETING THEN
DELETE FROM emp
WHERE emp.deptno=:old.deptno;
END IF;
END;

CREATE OR REPLACE TRIGGER dept_cascade3
AFTER UPDATE OF deptno ON dept
BEGIN
UPDATE emp SET update_id=NULL
WHERE update_id=integritypackage.updateseq;
END;

SELECT * FROM EMP ORDER BY DEPTNO;
UPDATE dept SET deptno=25 WHERE deptno=20;
  帮助实现安全控制;
  例:保证对EMP表的修改仅在工作日的工作时间;
CREATE TABLE company_holidays(day DATE);

INSERT INTO company_holidays
VALUES(sysdate);
INSERT INTO company_holidays
VALUES(TO_DATE('21-10月-01', 'DD-MON-YY'));

CREATE OR REPLACE TRIGGER emp_permit_change
BEFORE INSERT OR DELETE OR UPDATE ON emp
DECLARE
Dummy NUMBER;
Not_on_weekends EXCEPTION;
Not_on_holidays EXCEPTION;
Not_working_hours EXCEPTION;
BEGIN
/* check for weekends */
IF TO_CHAR(SYSDATE, 'DAY') IN ('星期六', '星期日') THEN
RAISE not_on_weekends;
END IF;
/* check for company holidays */
SELECT COUNT(*) INTO dummy FROM company_holidays
WHERE TRUNC(day)=TRUNC(SYSDATE);
IF dummy >0 THEN
RAISE not_on_holidays;
END IF;
/* check for work hours(8:00 AM to 18:00 PM */
IF (TO_CHAR(SYSDATE,'HH24')<8 OR TO_CHAR(SYSDATE, 'HH24')>18) THEN
RAISE not_working_hours;
END IF;
EXCEPTION
WHEN not_on_weekends THEN
RAISE_APPLICATION_ERROR(-20324,
'May not change employee table during the weekends');
WHEN not_on_holidays THEN
RAISE_APPLICATION_ERROR(-20325,
'May not change employee table during a holiday');
WHEN not_working_hours THEN
RAISE_APPLICATION_ERROR(-20326,
'May not change employee table during no_working hours');
END;

    例:更新T_PARAMETER表中的某些行时,同步更新t_version表:
create or replace
TRIGGER TR_SYS_PARAMETER_VER_SYN
AFTER UPDATE OF PARAMETER_VALUE
ON T_PARAMETER
FOR EACH ROW
WHEN (old.PARAMETER_NAME='alarm_gps_interval_time' or
      old.PARAMETER_NAME='taxi_server_ip' or
      old.PARAMETER_NAME='taxi_server_port' or
      old.PARAMETER_NAME='sys_transfer_time' or
      old.PARAMETER_NAME='enable_card_bin_type' or
      old.PARAMETER_NAME='normal_gps_interval_time')
BEGIN

    IF :NEW.PARAMETER_VALUE !=ld.PARAMETER_VALUE THEN
       update t_version
       set version_value=to_char(sysdate,'yyyymmdd')
       where version_name='system_parameter_version';
    END IF;
END;
分享到:
评论

相关推荐

    Oracle触发器详解

    本文是触发器的概念,语法,实例 进行剖析

    Oracle触发器语法详解

    触发器是一种特殊的存储过程,它在插入,删除或修改特定表中的数据时触发执行,它比数据库本身标准的功能有更精细和更复杂的数据控制能力。数据库触发器有以下的作用:

    oracle 触发器实时调用java 中http接口

    oracle insert数据成功之后调用触发器,触发器调用存储过程,存储实时调用java http

    oracle触发器详解

    oracle触发器详解,对初步学习数据库的人有很大的帮助

    ORACLE PL_SQL编程之八:把触发器说透.pdf

    ORACLE PL_SQL编程之八:把触发器说透,ORACLE PL_SQL编程之八:把触发器说透ORACLE PL_SQL编程之八:把触发器说透ORACLE PL_SQL编程之八:把触发器说透ORACLE PL_SQL编程之八:把触发器说透

    Oracle触发器用法实例详解

    主要介绍了Oracle触发器用法,结合实例形式详细分析了Oracle触发器的概念,功能,语法及相关使用技巧,需要的朋友可以参考下

    Oracle触发器trigger详解

    主要为大家详细介绍了Oracle触发器trigger,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

    Oracle中触发器示例详解

    在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是...

    详解Oracle序列和触发器的使用

    详解Oracle序列和触发器的使用。。。。。。。。

    oracle数据库详解PPT

    oracle异常及触发器.ppt plsql过程及函数.ppt PLSQL介绍.ppt PLSQL控制结构.ppt PLSQL中使用SQL.ppt sql基本命令.ppt 锁和表分区.ppt 涉及到oracle数据库的方方面面,实在是不可多得的oracle黄金资料

    详解oracle中通过触发器记录每个语句影响总行数

    详解oracle中通过触发器记录每个语句影响总行数 需求产生:  业务系统中,有一步“抽数”流程,就是把一些数据从其它服务器同步到本库的目标表。这个过程有可能 多人同时抽数,互相影响。有测试人员反应,原来抽过...

    Oracle-PLSQL-编程语法详解-触发器.docx

    学习永无止境:触发器是许多关系数据库系统都提供的一项技术。在 ORACLE 系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的 PL/SQL 块。

    MySQL 触发器详解及简单实例

    MySQL 触发器简单实例 语法 CREATE TRIGGER &lt;触发器名称&gt; –触发器必须有名字,最多64个字符,可能后面会附有分隔符.它和MySQL中其他对象的命名方式基本相象. { BEFORE | AFTER } –触发器有执行的时间设置:...

    Oracle常用对象大全及实例详解.pdf

    本文介绍了Oracle 中的表、索引、视图、同义词、函数、存储过程、触发器及包等。测试通过的基础上,采用语法结合实例的方式,对这些常用对象使用方法、命令、步骤及注意事项进行了说明和讲解,读者按照本文学习,...

Global site tag (gtag.js) - Google Analytics