触发器学习笔记(:new,:old用法)

触发器是数据库发生某个操作时自动运行的一类的程序

        用于保持数据的完整性或记录数据库操作信息方面

        触发器不能够被直接调用,只能够在某些事件发生时被触发,也就是系统自动进行调用触发器的构建语法   www.2cto.com

   create [or replace] trigger trigger_name

   before|after

   event1 [ or event2 or event3 …]

   on table_name [for each row]

   begin

   statement;

   …

   end;

    event通常是insert、delete或update等DML操作

说明:

    For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的          话,表示是表级触发器,则无论操作多少行,都只触发一次;

When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块.

  www.2cto.com

触发器分为语句级触发器和行级触发器

    语句级触发器是指每执行一条DML语句,该触发器就执行一次

    行级触发器是指每个DML操作影响几条记录,就会触发几次(for each row)

    行级触发器中由于涉及到了每条记录的数据变动,所以对于每条记录的数据来说就有新值和旧值之分

关键字: 

:NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。 

   

示例(1)

   --记录操作数据库信息方面

   --创建一个t_emp2_log表用于存储用户对emp2表所做的操作信息

   create table t_emp2_log(

          t_id  number(10) primary key,  --编号

          t_date  date,     --修改日期

          t_user  varchar2(20),  --操作用户

          action varchar(20)   --该用户所做操作

   );

   --创建触发器t_emp2,当有用户对表emp2操作的时候,就会触发该触发器,记录改用户对表emp2所做的操作

   create or replace trigger t_emp2

          after update or delete or insert on emp2

   begin

          if updating then --当执行更新操作时执行

             insert into  t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user,    'update');

          elsif deleting then --当执行删除操作时执行

             insert into t_emp2_log values(seq_t_emp2_log.nextval,sysdate, user,    'delete');

          elsif inserting then -- 当执行插入操作时

             insert into t_emp2_log values(seq_t_emp2_log.nextval, sysdate, user,           'inserting');

          end if;

   end;

示例(2)

   --保持数据的完整性...

   create table dept2 as select * from dept;

   --当存在依赖表时,当主表的信息发生改变时,依赖表的相应信息也会发生改变

   create or replace trigger tr_emp2

   --当主表dept2发生改变时,

          after update on dept2 for each row

   begin

   --依赖表也会发生相应的变化,以保持数据的完整性

          update emp2 e set e.deptno = :NEW.deptno where  e.deptno = :OLD.deptno;

   end;

示例 (3)

   两个表  字段完全一样

   例如:emp  表   emp_ copy  表

   要求 :写一个触发器

  提示:  :NEW   :OLD

功能实现

   当往emp表内添加字段且deptno=10的时候 往emp_copy表copy此数据

   在emp表更新数据时且修改deptno=10 的时候   往emp_copy表copy此数据

  www.2cto.com

   --向emp_copy表copy新数据

   --emp_copy可以存在相同的记录

   create or replace trigger tr_emp_copy

          after insert or update on emp2 for each row

   begin

          if inserting then

             if :NEW.deptno = 10 or :OLD.deptno = 10 then

                 insert into emp_copy values(:NEW.empno, :NEW.ename, :NEW.job,

   :NEW.mgr,:NEW.hiredate, :NEW.sal, :NEW.comm, :NEW.deptno);

             end if;

          elsif updating then

             if :OLD.deptno = 10 then

                insert into emp_copy values(:NEW.empno, :NEW.ename, :NEW.job,

   :NEW.mgr,:NEW.hiredate, :NEW.sal, :NEW.comm, :NEW.deptno);

             end if;

          end if;

   end;

--注意事项

   /*

     不管是after ,还是 before  在update , insert , delete 时,一定是在事务提交之后才会触发触发器

     before 和after的区别:before:insert update 可以对new进行修改。

                       after :不能对new 进行修改

                      二者都不能对old 进行修改

   */

   create or replace trigger tri_emp2

          before update on dept2 for each row

   begin

          :NEW.deptno := 80;

          update emp2 e set e.deptno = :NEW.deptno where e.deptno = :OLD.deptno;

end; 

触发器学习笔记(:new,:old用法)的更多相关文章

  1. jQuery学习笔记之Ajax用法详解

    这篇文章主要介绍了jQuery学习笔记之Ajax用法,结合实例形式较为详细的分析总结了jQuery中ajax的相关使用技巧,包括ajax请求.载入.处理.传递等,需要的朋友可以参考下 本文实例讲述了j ...

  2. C++学习笔记之pimpl用法详解

    原文链接:https://www.jb51.net/article/122557.htm 在编写稳定代码是,管理好代码间的依赖性是不可缺少的一个环节.特别是库文件的编写中,减少代码间的依赖性可以提供一 ...

  3. MYSQL触发器学习笔记

    课程学至金色晨曦科技公司技术总监沙利穆 触发器 1.       什么是触发器 触发器是一种特殊类型的存储过程,不由用户直接调用.创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执 ...

  4. seajs教程之seajs学习笔记 seajs.use用法

    seajs.use 用来在页面中加载模块.通过 use 方法,可以在页面中加载任意模块. 实例地址:http://www.android100.org/html/201405/23/12807.htm ...

  5. MVC学习笔记--IEnumerable的用法

    IEnumerable的用法 IEnumerable和IEnumerable<T>接口在.NET中是非常重要的接口,它允许开发人员定义foreach语句功能的实现 并支持非泛型方法的简单的 ...

  6. Oracle学习笔记_06_CASE WHEN 用法介绍

    1. CASE WHEN 表达式有两种形式 --简单Case函数 CASE sex ' THEN '男' ' THEN '女' ELSE '其他' END --Case搜索函数 CASE ' THEN ...

  7. 触发器五(建立INSTEAD OF触发器)(学习笔记)

    INSTEAD OF触发器 对于简单视图,可以直接执行INSERT,UPDATE和DELETE操作但是对于复杂视图,不允许直接执行INSERT,UPDATE和DELETE操作.为了在具有以上情况的复杂 ...

  8. 触发器三(行级DML触发器)(学习笔记)

    行级DML触发器 每当一条记录出现更新操作时进行触发操作定义时要定义FOR EACH ROW 使用":old.字段"和":new.字段"标识符 No. 触发语句 ...

  9. 触发器二(DML触发器)(学习笔记)

    DML触发器(语句触发器) 由DML语句进行触发,当用户执行了INSERT,UPDATE,DELETE操作时就会触发操作 示例一.只有在每个月的10日才允许办理,新员工入职与离职,其他时间不允许增加和 ...

随机推荐

  1. Oracle学习中,重点是sql语句的学习,而所有的sql语句都要在scott用户下完成。

    熟悉这个用户下的四张表,是必要的. 查看所有表名: SELECT * FROM tab; 查看每张表的结构: DESC 表名称: 1.部门表:dept no  名称 类型 描述 1 DEPTNO NU ...

  2. ACM-DP之最大连续子序列——hdu1231

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. python笔记25-mock-server之moco

    前言 mock除了用在单元测试过程中,还有一个用途,当前端开发在开发页面的时候,需要服务端提供API接口 此时服务端没开发完成,或者说没搭建测试环境,这个时候前端开发会自己mock一个api服务端,自 ...

  4. 10 Big Data Possibilities for 2017 Based on Oracle's Predictions

    2017 will see a host of informed predictions, lower costs, and even business-centric gains, courtesy ...

  5. django的单元测试框架unittest、覆盖率

    django的单元测试 指定测试范围: 指定运行某些测试文件./manage.py test --pattern="tests_*.py" -v 2 运行所有测试文件./manag ...

  6. Guava Files 源码分析(一)

    Files中的工厂 Files类中对InputStream, OutputStream以及Reader,Writer的操作封装了抽象工厂模式,抽象工厂是InputSupplier与OutputSupp ...

  7. 混沌数学之CircuitChaotic(二维离散电路混沌系统)

    相关软件参见:混沌数学之离散点集图形DEMO 相关代码: // http://wenku.baidu.com/link?url=yg_gE7LUXCg2mXRp-ZZdfRXXIkcNj8YOhvN7 ...

  8. 上下变换中 aspect的选择

    在电视制作还没有完全整转到高清之前,有很多原来的SD素材需要转到HD信号进入高清切换或者编辑平台,电视台是电视节目的发射源端 ,所以上变换过程不能引入额外的噪声或者失真: 上变换使用的方式一般有4种: ...

  9. jQuery多文件下载

    文件下载是一个Web中非常常用的功能,不过你是做内部管理系统还是做面向公众的互联网公司都会遇到这个问题,对于下载一般有点实际开发经验的都会自己解决,上周弄了一下多文件下载,业务场景就是一条数据详细信息 ...

  10. scala 学习笔记七 基于类型的模式匹配

    1.介绍 Scala 提供了强大的模式匹配机制,应用也非常广泛. 一个模式匹配包含了一系列备选项,每个都开始于关键字 case.每个备选项都包含了一个模式及一到多个表达式.箭头符号 => 隔开了 ...