行级触发器:

当触发器被触发时,要使用被插入、更新或删除的记录中的列值,有时要使用操作前、后列的值.

:NEW 修饰符访问操作完成后列的值

:OLD 修饰符访问操作完成前列的值

例1: 建立一个触发器, 当职工表 emp 表被删除一条记录时,把被删除记录写到职工表删除日志表中去。

CREATE   TABLE  emp_his  AS   SELECT   *   FROM  EMP  WHERE   1 = 2 ; 

CREATE   OR   REPLACE   TRIGGER  tr_del_emp
BEFORE DELETE -- 指定触发时机为删除操作前触发
ON scott.emp
FOR EACH ROW -- 说明创建的是行级触发器
BEGIN
-- 将修改前数据插入到日志记录表 del_emp ,以供监督使用。
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 ;
DELETE emp WHERE empno = 7788 ;
DROP TABLE emp_his;
DROP TRIGGER del_emp;

例2:限制对Departments表修改(包括INSERT,DELETE,UPDATE)的时间范围,即不允许在非工作时间修改departments表。

CREATE   OR   REPLACE   TRIGGER  tr_dept_time
BEFORE INSERT OR DELETE OR UPDATE
ON departments
BEGIN
IF (TO_CHAR(sysdate, ' DAY ' ) IN ( ' 星期六 ' , ' 星期日 ' )) OR (TO_CHAR(sysdate, ' HH24:MI ' ) NOT BETWEEN ' 08:30 ' AND ' 18:00 ' ) THEN
RAISE_APPLICATION_ERROR( - 20001 , ' 不是上班时间,不能修改departments表 ' );
END IF ;
END ;

例3:限定只对部门号为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 ;

/* 
实例: 
UPDATE employees SET salary = 8000 WHERE employee_id = 177; 
DELETE FROM employees WHERE employee_id in (177,170); 
*/

例4: 利用行触发器实现级联更新。在修改了主表 regions 中的 region_id 之后( AFTER ),级联的、自动的更新子表 countries 表中原来在该地区的国家的 region_id 。

CREATE   OR   REPLACE   TRIGGER  tr_reg_cou
AFTER update OF region_id
ON regions
FOR EACH ROW
BEGIN
DBMS_OUTPUT.PUT_LINE( ' 旧的region_id值是 ' || :old.region_id
|| ' 、新的region_id值是 ' || :new.region_id);
UPDATE countries SET region_id = :new.region_id
WHERE region_id = :old.region_id;
END ;

例5:在触发器中调用过程。

CREATE   OR   REPLACE   PROCEDURE  add_job_history
( p_emp_id job_history.employee_id % type
, p_start_date job_history.start_date % type
, p_end_date job_history.end_date % type
, p_job_id job_history.job_id % type
, p_department_id job_history.department_id % type
)
IS
BEGIN
INSERT INTO job_history (employee_id, start_date, end_date,
job_id, department_id)
VALUES (p_emp_id, p_start_date, p_end_date, p_job_id, p_department_id);
END add_job_history; -- 创建触发器调用存储过程...
CREATE OR REPLACE TRIGGER update_job_history
AFTER UPDATE OF job_id, department_id ON employees
FOR EACH ROW
BEGIN
add_job_history(:old.employee_id, :old.hire_date, sysdate,
:old.job_id, :old.department_id);
END ;

oracle的行级触发器使用的更多相关文章

  1. oracle 的行级触发器

    create or replace trigger tri_insertAcceptList after insert on STDOC.DEVELOPER for each row DECLARE ...

  2. oracle学习----行级锁的理解

    通过实验来理解行级锁的发生 1.创建需要的表 SQL> conn / as sysdba已连接.SQL> create table dept as select * from scott. ...

  3. Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

    触发器是存放在数据库中的一种特殊类型的子程序.不能被用户直接调用,而是当特定事件或操作发生时由系统自己主动 调用执行.触发器不能接受參数.所以执行触发器就叫做触发或点火.Oracle事件指的是数据库的 ...

  4. Oracle Day09 存储与触发器

    1.存储 存储过程.存储函数:指存储在数据库中供所有用户程序调用的子程序. --创建存储过程(procedure) --用create procedure 命令建立存储过程. 格式: create o ...

  5. .Net程序员学用Oracle系列(25):触发器详解

    1.触发器理论 1.1.触发器的应用场景 1.2.触发器的类型 1.3.DML 触发器的触发顺序 2.触发器实战 2.1.创建触发器 2.1.1.创建 DML 触发器 2.1.2.创建 DDL 触发器 ...

  6. Oracle 基本语法、触发器、视图

    参考文章:https://www.cnblogs.com/linjiqin/category/349944.html 数据库分类 1.小型数据库:access.foxbase 2.中型数据库:inor ...

  7. 【Oracle】详解ORACLE中的trigger(触发器)

    本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...

  8. ORACLE PL/SQL:触发器

    ORACLE PL/SQL 触发器 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8 ...

  9. oracle 学习笔记之触发器

    说明 数据库触发器是一个与表相关联的.存储的PL/SQL程序. 每当一个特定的数据操作语句(Insert,update,delete)在指定的表上发出时,Oracle自己主动地运行触发器中定义的语句序 ...

随机推荐

  1. HDU 4709 3-idiots FFT 多项式

    http://acm.hdu.edu.cn/showproblem.php?pid=4609 给一堆边,求这一堆边随便挑三个能组成三角形的概率. 裸fft,被垃圾题解坑了还以为很难. 最长的边的长度小 ...

  2. POP3_使用SSL链接邮箱并获取邮件

    Gmail目前已经启用了POP3和SMTP服务,与其他邮箱不同的是Gmail提供的POP3和SMTP是使用安全套接字层SSL的,因此常规的JavaMail程序是无法收发邮件的,下面是使用JavaMai ...

  3. 在windows下安装配置python开发环境及Ulipad开发工具(转)

    最近开始学习Python,在网上寻找一下比较好的IDE.因为以前用C#做开发的,用Visual Studio作为IDE,鉴于用惯了VS这么强大的IDE,所以对IDE有一定的依赖性. Python的ID ...

  4. 使用 IntraWeb (8) - 系统模板

    我们可以自定义系统错误模板, 编辑 IWError.html 放到模板文件夹后, 它将替换默认的模板. {在主页面, 这是要模拟一个系统错误} procedure TIWForm1.IWButton1 ...

  5. 使用CefSharp在.Net程序中嵌入Chrome浏览器(三)——基本操作

    CefSharp本身提供了WPF和WinForm两个版本的控件,这两个版本的控件使用方法大同小异,由于我WPF的版本用的较多,这里就简单的介绍下WPF版的CEFSharp控件的用法. 加载页面: Ch ...

  6. Oracle数据库日期范围查询的两种实现方式

    参考文档:http://database.51cto.com/art/201108/288058.htm Oracle数据库日期范围查询有两种方式:to_char方式和to_date方式,接下来我们通 ...

  7. [Go] 判断 文件/文件夹 是否存在?

    Golang 判断文件是否存在有点怪异,是根据在操作文件时返回的错误信息来判断的,而不能直接根据路径判断 版本1: func IsExists(path string) (bool, error) { ...

  8. Linux网络编程--sendfile零拷贝高效率发送文件

    from http://blog.csdn.net/hnlyyk/article/details/50856268 Linux系统使用man sendfile,查看sendfile原型如下: #inc ...

  9. WCF Routing服务,负载均衡

    WCF4.0支持路由机制,通过RoutingService实现请求分发.拦截处理. 一.应用场景 1.暴露一个endpoint在外网,其余服务部署于内网: 2.请求分发,能对服务做负载功能: 二.WC ...

  10. Android 程序目录介绍

    还是回到 Eclipse 中,首先展开 HelloWorld 项目,你会看到如图 1.17 所示的目录结构. 图   1.17 一开始看到这么多陌生的东西,你一定会感到有点头晕吧.别担心,我现在就对上 ...