触发器学习笔记(: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. Android之ConnectivityManager

    在android平台中ConnectivityManager主要负责查询网络连接状态以及在连接状态有变化的时候发出通知.其主要的功能职责如下: 1.  监视网络状态,包括(Wi-Fi.GPRS.UMT ...

  2. Juce源代码分析(一)Juce的优势

    为什么学习Juce JUCE (Jules' Utility Class Extensions)是由Raw MaterialSoftware公布的一套基于c++的跨平台应用程序框架类库(Windows ...

  3. Spring Framework 4.0.0发布,首次支持Java 8

    Spring项目组今天发布了Spring 框架4.0.0版本.Spring是一个开源的轻量级Java SE和Java EE开发应用框架,其目的是用于简化企业级应用程序开发. Spring框架第一个版本 ...

  4. MAC之tar解压与压缩打包命令

    tar [-cxtzjvfpPN] 文件与目录 ....参数:-c :建立一个压缩文件的参数指令(create 的意思):-x :解开一个压缩文件的参数指令!-t :查看 tarfile 里面的文件! ...

  5. mysql的TABLE_SCHEMA的sql和information_schema表, MySQL管理一些基础SQL语句, Changes in MySQL 5.7.2

    3.查看库表的最后mysql修改时间, 如果第一次新建的表可能还没有update_time,所以这里用了ifnull,当update_time为null时用create_time替代 select T ...

  6. strstr实现

    // strstr.c查找完全匹配的子字符串 #include<stdio.h> #include<string.h> char *my_strstr(const char * ...

  7. MiniGUI ial 移植指南

    MiniGUI ial 移植指南 2.1 ial的定义 ial是一个通用的抽象输入接口,可以输入统一的数据的结构,也就是说在MiniGUI的核心代码里输入的数据的格式是固定的,不管输入设备是鼠标 还是 ...

  8. SVN使用小结

    SVN是Subversion的简称.是一个开放源码的版本号控制系统.在它的管理下,文件和文件夹能够超越时空的限制,权且当作一种奇妙的"时间机器"吧. 基本功能 版本号控制 作为一个 ...

  9. 创建spring boot项目启动报错遇到的问题

    1.Spring boot,Mybatis 启动报错 Failed to auto-configure a DataSource *************************** APPLICA ...

  10. Splunk的安装与使用

    一.简单介绍         Splunk 是机器数据的引擎.使用 Splunk 可收集.索引和利用全部应用程序.server和设备(物理.虚拟和云中)生成的高速移动型计算机数据 .从一个位置搜索并分 ...