Chinaunix首页 | 论坛 | 博客
  • 博客访问: 51810
  • 博文数量: 23
  • 博客积分: 1415
  • 博客等级: 上尉
  • 技术积分: 281
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-04 16:00
文章分类

全部博文(23)

文章存档

2014年(19)

2008年(1)

2007年(3)

我的朋友

分类: Oracle

2014-05-30 16:12:14

                                           
前言:
      一般PL/SQL块,当执行完成后,就消失了;下次执行时,还需要再次编写。因此人们希望能够将PL/SQL块存储在数据
  库中,并且可以多次执行,在这种需求的驱动下出现了有名PL/SQL块(也叫做非匿名块)。非匿名PL/SQL块分为:存储过程、
  函数、触发器。本文详细介绍触发器的使用。

一、触发器结构

  1、触发器(trigger):
   
       1>是一个有名PL/SQL块。
       2>存储在数据库中
       3>无需手动执行,只要触发事件发生,就自动会执行。一般用于数据完整性和审核等操作
         
  2、触发器的组成:

    create or replace trigger triger_name
     trigger_time                         //触发时机
     trigger_event                        //触发事件
     on trigger_object                    //触发对象
     [WHEN 触发条件]                      //可选
     [for each row]                      //可选,定义是否为行级触发器
     PL/SQL块 | call procdure_name;

二、触发时机  ----触发器何时执行

    1、前触发(before) : 触发动作发生在触发事件执行之前。
    2、后触发(after): 触发动作发生在触发事件执行之后。
    3、替代触发(instead of):用触发提替代触发事件

三、触发事件 -----触发器必须由事件才能触发
    1、DML事件  (INSERT,UPDATE,DELETE)
    2、DDL事件   (CREATE,ALTER,DROP,RENAME,TRUNCATE)
    3、DB事件    (STARTUP,SHUTDOWN,LOGON,LOGOFF,SERVERERROR)


四、触发对象
    1、表  :触发器定义在表上
    2、模式(schema) :触发器定义在模式上
    3、视图 :触发器定义在视图上
    4、数据库:触发器定义在数据库上


五、触发器种类
    1、DML触发器:定义在表上,由DML事件引发的触发器 
    2、替代触发器(INSTEAD OF):定义在视图上,用来替换对视图进行的插入、删除和修改操作。
    3、系统事件触发器:定义在整个数据库或模式上,由系统事件引发的触发器。系统事件包括DDL事件,DB事件。
      
    说明:为了编写方便,这里将系统事件触发器又分为如下两小类:
       1)DDL触发器:定义在整个数据库或模式上,由DDL事件引发的触发器(这里的事件包括了garnt,revoke事件,这里算是ORACLE 一个小BUG)
       2)DB触发器:定义在整个数据库上,由DB事件引发的触发器

六、触发级别 

    1、行级触发(for each row): 每一行都触发一次。比如,update更新了100行数据,行级触发器触发100次。
    2、语句级触发: 整个语句级别只触发一次。比如,update更新了100行数据,语句级触发器只触发一次。

七、触发器限制

    1、如果有多个触发器被定义成为相同时间、相同事件触发,且最后定义的触发器是有效的,则最后定义的触发器被触发,其他触发器不执行。
    2、一个触发器可由多个不同的DML事件触发。
    3、在触发器中,可用INSERTING、DELETING、UPDATING谓词来区别不同的DML操作。这些谓词可以在IF分支条件语句中作为判断条件来使用。
    4、在行级触发器中,用:new 和:old(称为伪记录)来访问数据变更前后的值。
       1)INSERT语句插入一条新记录,所以没有:old记录
       2)DELETE语句删除掉一条已经存在的记录,所以没有:new记录。
       3)UPDATE语句既有:old记录,也有:new记录,分别代表修改前后的记录。
       4)引用具体的某一列的值的方法是: :new.字段名
    5、触发器体内禁止使用COMMIT、ROLLBACK、SAVEPOINT语句,也禁止直接或间接地调用含有上述语句的存储过程和函数。因为
       触发器是和触发事件在一个事务中,它随着触发事件的提交而提交,回滚而回滚。
    6、CREATE TRIGGER语句文本的字符长度不能超过32KB;
    7、触发器体内的SELECT 语句只能为SELECT … INTO …结构,或者为定义游标所使用的SELECT 语句。
    8、触发器中不能使用LONG, LONG RAW 类型;
    9、触发器内可以参照LOB 类型列的列值,但不能通过 :NEW 修改LOB列中的数据;

八、DML触发器的要点
     
   1、确定触发的表;即在其上定义触发器的表。
   2、确定触发的事件;INSERT、UPDATE和DELETE
   3、确定触发时间;BEFORE和AFTER两种,分别表示触发动作发生在DML语句执行之前和语句执行之后。
   4、确定触发级别;是语句级触发器和行级触发器两种。
                   语句级触发器表示SQL语句只触发一次触发器,行级触发器表示SQL语句影响的每一行都要触发一次

九、触发器操作
   
    1、创建触发器:

       create or replace trigger triger_name
       trigger_time                         //触发时机
       trigger_event                        //触发事件
       on trigger_object                    //触发对象
       WHEN 触发条件                        //可选
       [for each row]                       //可选,定义是否为行级触发器
       declare
        ...
       begin
        ...
       exception
        ...
       end; |call procedure_name;

    2、删除触发器:
  
       --触发器的创建者或具有DROP ANY TIRGGER系统权限的人才能删除触发器

       DROP TIRGGER trigger_name;

    3、改变触发器状态:

       ALTER TRIGGER trigger_name {DISABLE|ENABLE}
   
       其中,DISABLE表示使触发器失效,ENABLE表示使触发器生效。

    4、触发器错误查看:

       show errors

    5、重新编译触发器:

       alter trigger trigger_name compile; 
   
    6、查看触发器信息:
   
       select * from dba_triggers;
       select * from user_triggers;

阅读(222) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~