文档章节

Oracle 触发器

一别经年
 一别经年
发布于 2016/05/15 15:26
字数 619
阅读 25
收藏 1


Oracle触发器 

一、定义:
    在触发事件发生时隐式自动运行的(PL/SQL)程序块。触发器不能接收参数,不能被别的程序、函数等调用。
二、构成: 
    触发器名称
    触发器的触发事件
    触发器的限制条件
    触发器执行语句
DML触发器触发事件:
    表插入、表更新、表删除
触发器触发时机:
    BEFORE AFTER
触发器种类:
    1.语句级触发器:
        语句级触发器在每个数据修改语句执行后只调用一次,而不管这一操作将影响到多少行。
     摘自百科:   例:创建一个orderdetails_tablelog表及一个AFTER触发器,用于记录是哪些用户删除了orderdetails表中的数据及删除的时间。
            CREATE TABLE orderdetails_tablelog
            (
                   WHO VARCHAR2(40),
                   OPER_DATE DATE
            );
            CREATE OR REPLACE TRIGGER DELE_ORDERDETAILS
              AFTER DELETE ON ORDERDETAILS
            BEGIN
              INSERT INTO ORDERDETAILS_TABLELOG
                (WHO, OPER_DATE)
              VALUES
                (USER, SYSDATE);
    在该触发器被触发后,尽管一次删除多条记录,但触发器只执行一次插入操作。

    2.行级触发器
    行级触发器是按触发语句所处理的行激发的,可以引用受到影响的行值。创建触发器时采用关键字FOR EACH ROW
    这种访问是通过两个相关的标识符实现的
    :old :用于存放未进行修改前的数据
    :new :用于存放进行修改后的数据


    3.级联触发器
    把一个数据库触发器的动作与另一个触发器联系起来,使之触发另一个触发器。

    
三、语法:
    CREATE [OR REPLACE] TRIGGER trigger_name    --触发器名字
    {BEFORE | AFTER | INSTEAD OF} triggering_event  --触发事件
    [WHEN trigger_condition]                 --限制条件
    [FOR EACH ROW]                          --行级触发
    trigger_body;                                  --执行语句体

    语法说明:
    trigger_name是触发器的名称。
    triggering_event说明了激发触发器的事件(也可能包括特殊的表或视图)。
     trigger_body是触发器的代码。
    如果在WHEN子句中指定trigger_condition的话,则首先对该条件求值。触发器主体只有在该条件为真值时才运行。

    DML触发器是针对某个表进行DML操作时触发的。
    DML = Data manipulation language(数据操纵语言)

详细语法格式: 
    CREATE [ OR REPLACE ] TRIGGER trigger_name
    { BEFORE | AFTER }
    { INSERT | DELETE | UPDATE [OF column[,column…] ] } ON { table_name | view_name}
    [ REFERENCING 
    { OLD [AS] old_name | NEW [AS] new_name } ]
    [ FOR EACH ROW ] 
    [ WHEN trigger_condition ] 
    trigger_body;


四、例子

create or replace trigger "TRI_SA_UPDATE" 
  after update on xx_table  (BEFORE INSERT ON)
  for each row
declare
  -- local variables here
begin

  IF :NEW.NUM_VALUE <> :OLD.NUM_VALUE THEN
       XXX
  END IF;
EXCEPTION
  WHEN OTHERS THEN
    RAISE_APPLICATION_ERROR(-20001, '',TRUE);
end TRI_SA_UPDATE;

© 著作权归作者所有

一别经年
粉丝 17
博文 174
码字总数 60456
作品 0
西安
程序员
私信 提问
oracle pl/sql之触发器(trigger)

一.oracle触发器介绍 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时...

ZIJIAN1012
2014/04/21
0
0
Oracle 11g 的新特性 —— 组合触发器 (Compound Triggers)

之前我们介绍了 Oracle 11g 新特性中的 虚拟列 和 只读表,今天我们介绍另外一个新特性 —— 组合触发器。 在以前版本的 Oracle 中,你可通过 FOLLOWS 关键字来控制触发器执行的顺序,例如:...

红薯
2012/07/26
3.4K
3
Oracle 11g 的新特性 —— 组合触发器 (Compound Triggers)

之前我们介绍了 Oracle 11g 新特性中的 虚拟列 和 只读表,今天我们介绍另外一个新特性 —— 组合触发器。 在以前版本的 Oracle 中,你可通过 FOLLOWS 关键字来控制触发器执行的顺序,例如:...

tsl0922
2012/11/27
513
0
【强烈强烈推荐】《ORACLE PL/SQL编程详解》全原创(共八篇)--系列文章导航

《ORACLE PL/SQL编程详解》 系列文章目录导航 ——通过知识共享树立个人品牌。 本是成书的,但后来做其他事了,就无偿的贡献出来,被读者夸其目前为止最“实在、经典”的写ORACLE PL/SQL编程...

yonghu86
2012/07/30
0
0
通过shell定时开关特殊的触发器

工作临时碰到这种奇葩的需求,所以写了个shell脚本实现了这个功能。本着开源共享的精神,把干货分享给大家。希望能够帮助大家解决工作中碰到的这个问题。 1、需要建立2个脚本,分别开关触发器...

yangfei86
2014/06/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Angular 英雄编辑器

应用程序现在有了基本的标题。 接下来你要创建一个新的组件来显示英雄信息并且把这个组件放到应用程序的外壳里去。 创建英雄组件 使用 Angular CLI 创建一个名为 heroes 的新组件。 ng gener...

honeymoose
今天
5
0
Kernel DMA

为什么会有DMA(直接内存访问)?我们知道通常情况下,内存数据跟外设之间的通信是通过cpu来传递的。cpu运行io指令将数据从内存拷贝到外设的io端口,或者从外设的io端口拷贝到内存。由于外设...

yepanl
今天
6
0
hive

一、hive的定义: Hive是一个SQL解析引擎,将SQL语句转译成MR Job,然后再在Hadoop平台上运行,达到快速开发的目的 Hive中的表是纯逻辑表,就只是表的定义,即表的元数据。本质就是Hadoop的目...

霉男纸
今天
5
0
二、Spring Cloud—Eureka(Greenwich.SR1)

注:本系列文章所用工具及版本如下:开发工具(IDEA 2018.3.5),Spring Boot(2.1.3.RELEASE),Spring Cloud(Greenwich.SR1),Maven(3.6.0),JDK(1.8) Eureka: Eureka是Netflix开发...

倪伟伟
昨天
15
0
eclipse常用插件

amaterasUML https://takezoe.github.io/amateras-update-site/ https://github.com/takezoe/amateras-modeler modelGoon https://www.cnblogs.com/aademeng/articles/6890266.html......

大头鬼_yc
昨天
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部