触发器学习笔记(: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. Memcached 集群架构方面的问题

    *  集群架构方面的问题 o memcached是怎么工作的? o memcached最大的优势是什么? o memcached和MySQL的query cache相比,有什么优缺点? o memca ...

  2. C/C++ 读取16进制文件

    1.为什么有这种需求 因为有些情况需要避免出现乱码.不管什么编码都是二进制的,这样表示为16进制就可以啦. 2.如何读取16进制文件 最近编程用这一问题,网上查了一下,感觉还是自己写吧. 16进制数据 ...

  3. Cesium随笔(1)部署自己的项目 【转】

    Cesium是国外开发的基于Webgl的跨浏览器的三维地球显示的Javascript开源库,只要浏览器支持Webgl,html5就可以运行.甚至部分手机浏览器都可以运行 . 首先,对Cesium进行本 ...

  4. Evaluate Reverse Polish Notation leetcode java

    题目: Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are + ...

  5. 你可能不知道的5 个强大的HTML5 API 函数

    HTML5提供了一些非常强大的JavaScript和HTML API,来帮助开发者构建精彩的桌面和移动应用程序.本文将介绍5个新型的API,希望对你的开发工作有所帮助. 1.  全屏API(Fulls ...

  6. C#_文件读写常用类介绍

    首先要熟悉.NET中处理文件和文件夹的操作.File类和Directory类是其中最主要的两个类.了解它们将对后面功能的实现提供很大的便利.      本节先对和文件系统相关的两个.NET类进行简要介 ...

  7. 运用CSS改进网站设计的3个技巧

    CSS是一种分离表述编码和实际内容的一种最有用的方式,也是一种使搜索引擎最优化的方式,通常,网站设计中会建立一整套的css样式标准,这些标准存储在一个扩展名为css的单独文件中.然后利用HTML标签设 ...

  8. 即时通讯之smack客户端配置

    之前学习了通过Openfire+spark+smack的模式来完成我们的即时通讯软件,上次我们已经完成了Openfire的安装和配置,这次我们继续完成我们的客户端部分. 1.首先我们通过百度smack ...

  9. [JSP]JSP中include指令和include动作的差别

    include指令是编译阶段的指令,即include所包括的文件的内容是编译的时候插入到JSP文件里,JSP引擎在推断JSP页面未被改动,否则视为已被改动. 因为被包括的文件是在编译时才插入的.因此假 ...

  10. socketio server推送

    假设面试官问你:要把server端的数据时时显示在浏览器上怎么实现?我想有非常多人会回答使用Ajax技术定时去訪问一个资源,没错,使用Ajax的确能实现.但面试官要的绝对不是这个答案. 由于使用Aja ...