触发器学习笔记(: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. DTO vs. Assembly(转载)

    DTO vs. Assembly We probably need to make a strong statement about data transfer objects. Do we like ...

  2. remotepath != null 与 !TextUtils.isEmpty(remotepath) 的差别

    remotepath != null   与 !TextUtils.isEmpty(remotepath) 的差别 !TextUtils.isEmpty(remotepath)    与   remo ...

  3. [runtime] MAObjCRuntime

    MAObjCRuntime 源码地址:(引入头文件MARTNSObject.h即可,非arc环境下) http://pan.baidu.com/s/1eQ6776U https://github.co ...

  4. Python3.6学习笔记(三)

    面向对象编程 面向对象编程 Object Oriented Programming 简称 OOP,是一种程序设计思想.OOP把对象作为程序的基本单元,一个对象包含了数据和操作数据的函数. 面向过程的程 ...

  5. C语言编程规范

    C语言编程规范 6 函数与过程 6.1 函数的功能与规模设计 函数应当短而精美,而且只做一件事.不要设计多用途面面俱到的函数,多功能集于一身的函数,很可能使函数的理解.测试.维护等变得困难. 6.2 ...

  6. sudo:抱歉,您必须拥有一个终端来执行 sudo 解决办法;ssh执行sudo命令的方法;给用户增加sudo免密权限

    1.supervisor使用sudo执行命令的时候,报错 2.解决办法: 编辑 /etc/sudoers 文件,将Default requiretty注释掉. sudo vim /etc/sudoer ...

  7. MyBatis Lazy Loading

    MyBatis的Lazy Loading可以实现延迟查询Bean里的嵌套成员类,控制lazy loading的<settings>属性有 lazyLoadingEnabled: lazy ...

  8. [转]聊聊技术选型 - Angular2 vs Vue2

    转载:https://juejin.im/post/58cab85b44d9040069f38f7a "Come, and take choice of all my library, An ...

  9. std::vector利用swap()函数进行内存的释放【转】

    首先,vector与deque不同,其内存占用空间只会增长,不会减小.比如你首先分配了10,000个字节,然后erase掉后面9,999个,则虽然有效元素只有一个,但是内存占用仍为10,000个.所有 ...

  10. 80端口占用异常解决方法java.net.BindException: Address already in use: JVM_Bind:80(或8080)

    1:Tomcat(或其他Web容器)启动时控制台报错如下示: 2007-8-2 15:20:43 org.apache.coyote.http11.Http11Protocol init 严重: Er ...