触发器学习笔记(: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. andriod 浏览文件

    protected void browse() { Intent it = new Intent(Intent.ACTION_GET_CONTENT); //创建动作为 "选取" ...

  2. CentOS 6.5安装配置Nginx

    Ubuntu下安装nginx,直接apt-get install nginx就行了,很方便. 但是今天装了CentOS6.5,直接yum install nginx不行,要先处理下源,下面是安装完整流 ...

  3. PHP 7.0 5.6 下安裝 phpLDAPadmin 发生错误的修正方法

    在稍具規模的網路環境中, 網管時常選用 LDAP 來進行帳號的統整管理, 一方面提供管理便利度, 另一方面使用者也不必因為不同系統而記憶不同帳號, phpLDAPadmin 是一套常見的 LDAP 管 ...

  4. dtree实现动态加载树形菜单,动态插入树形菜单

    1.导入  dtree文件    dtree.css   img文件夹   dtree.js 2. 建立对应 的数据库      1      父ID     name    id 3    建立连接 ...

  5. java类与继承的执行顺序

    1.子类 public class TestClassLife extends TestClassLifeSuper { public TestClassLife() { System.out.pri ...

  6. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  7. C++ Primer 学习笔记_72_面向对象编程 --句柄类与继承[续]

    面向对象编程 --句柄类与继承[续] 三.句柄的使用 使用Sales_item对象能够更easy地编写书店应用程序.代码将不必管理Item_base对象的指针,但仍然能够获得通过Sales_item对 ...

  8. python opencv 人脸识别

    def findface(image): import cv2  frame=cv2.imread('n1.jpg') classifier=cv2.CascadeClassifier("h ...

  9. python 抓取alexa数据

    要抓取http://www.alexa.cn/rank/baidu.com网站的排名信息:例如抓取以下信息: 需要微信扫描登录 因为这个网站抓取数据是收费,所以就利用网站提供API服务获取json信息 ...

  10. 微博推荐算法学习(Weibo Recommend Algolrithm)

    原文:http://hijiangtao.github.io/2014/10/06/WeiboRecommendAlgorithm/ 基础及关联算法 作用:为微博推荐挖掘必要的基础资源.解决推荐时的通 ...