ITPub博客

首页 > 数据库 > Oracle > PL/SQL --> DML 触发器

PL/SQL --> DML 触发器

Oracle 作者:qq546811772 时间:2013-12-30 15:48:49 0 删除 编辑
何谓触发器?简言之,是一段命名的PL/SQL代码块,只不过该代码块在特定的条件下被触发并且执行。对于这样的代码我们称之为触发器

。触发器根据触发类型的不同又分为不同级别的触发器,下面将给出触发器的分类,定义,以及使用的示例。

 

一、触发器的相关概念

    1.触发器的分类

        通常根据触发条件以及触发级别的不同分为DML触发器,INSTEAD OF 触发器,系统事件触发器。

        DML触发器

            ORACLE 对DML语句进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。

        INSTEAD OF 触发器

            在ORACLE里,对于简单视图,可以直接使用DML进行操作,而复杂视图则不能直接使用DML,因此INSTEAD OF 触发器应运而生。

            INSTEAD OF 触发器主要是为解决复杂视图不能执行DML而创建。

        系统事件触发器 

            在 ORACLE 数据库系统的事件中进行触发,如ORACLE系统的启动与关闭等.使用系统触发器,便于系统跟踪,监测数据库变化情况等。

 

    2.触发器的组成(一段PL/SQL代码块,可以由PL/SQL,Java,C进行开发,特定事件发生将被触发)

        a.触发事件

            Oracle 启动、关闭

            Oracle 错误消息

            用户登录与断开会话

            特定的表、视图上的DML操作

            基于schema的DDL操作

        b.触发时间

            即该TRIGGER 是在触发事件发生之前(BEFORE)还是之后(AFTER)触发,也就是触发事件和该TRIGGER 的操作顺序。 

        c.触发器本身

            指实际的触发代码,当触发事件发生后,触发器代码决定将做何种操作。

            触发器代码大小不能超过32k,对于超长的代码可以将其置于单独的存储过程,然后在触发器中使用call 调用该过程。

            触发器代码只能包含DQL,DML,而不能包含DDL以及事务控制语言(COMMIT,ROLLBACK,SAVEPOINT) 。

        d.触发频率

            说明触发器内定义的动作被执行的次数。即语句级(STATEMENT)触发器和行级(ROW)触发器。

            语句级(STATEMENT)触发器:是指当某触发事件发生时,该触发器只执行一次。

            行级(ROW)触发器:是指当某触发事件发生时,对受到该操作影响的每一行数据,触发器都单独执行一次。

    3.触发器的用途

        控制DDL语句的行为,如通过更改、创建或重命名对象

        控制DML语句的行为,如插入、更新和删除

        实施参照完整性、复杂业务规则和安全性策略

        在修改视图中的数据时控制和重定向DML语句

        通过创建透明日志来审核系统访问和行为的信息

 

二、创建DML触发器语法描述

    1.创建触发器的语法

        CREATE [OR REPLACE] TRIGGER trigger_name

        {BEFORE | AFTER | INSTEAD OF}    

        {INSERT | DELETE | UPDATE [OF column [, column …]]}                  --定义触发类型,即那一种或多种DML以及特定的列

        ON {[schema.] table_name | [schema.] view_name}                       --特定的触发对象,表或视图

        [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]

        [FOR EACH ROW ]                                                       --定义触发器为行级触发器

        [WHEN condition]

        BEGIN

            trigger_body;

        END;

   

        BEFORE | AFTER | INSTEAD OF

            BEFORE指在执行DML之前触发触发器,AFTER则是指在DML执行之后触发触发器

            INSTEAD OF触发器只针对视图和对象视图建立,而不能对表、模式和数据库建立INSTEAD OF 触发器

           

        [REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]

            说明相关名称,在行触发器的PL/SQL块和WHEN 子句中可以使用相关名称参照当前的新,旧列值,默认的相关名称分别为OLD和NEW。

            触发器的PL/SQL块中应用相关名称时,必须在它们之前加冒号(:),但在WHEN子句中则不能加冒号。

           

        [FOR EACH ROW ]

            定义触发器为行级触发器。

            行级触发器和语句级触发器的区别表现在:一个DML语句可能操纵多行,也可能操纵一行,使用行级触发器,不论是一行还是多

            行数据被操纵,行触发器为该DML的每一行触发一次触发器操作。语句级触发器将整个语句操作作为触发事件,不论该语句影响

            了多少行,仅仅触发一次触发器。

            当省略FOR EACH ROW 选项时,BEFORE 和AFTER 触发器为语句触发器,而INSTEAD OF 触发器则为行触发器。   

           

        [WHEN condition]

            触发条件,当条件为TRUE时,触发器代码才会被执行,对于DML触发器,仅仅允许在行级触发器上指定触发条件。

            condition 为一个逻辑表达时,其中必须包含相关名称,而不能包含查询语句,也不能调用PL/SQL 函数。

WHEN 子句可通过引用new或old伪记录、一个组件选择符和一个列名来访问伪字段。

            WHEN 子句不能用在INSTEAD OF 行触发器和其它类型的触发器中。

           

    2.DML触发器的触发顺序

        a.在单行数据上的触发顺序(触发代码仅被执行一次)

            BEFORE 语句级触发器

                BEFORE 行级触发器

                AFTER 行级触发器

            AFTER 语句级触发器

        b.在多行数据上的触发顺序(语句级触发器仅被执行一次,行级触发器在每个作业行上被执行一次)

            BEFORE 语句级触发器

                BEFORE 行级触发器

                AFTER 行级触发器

                BEFORE 行级触发器

                AFTER 行级触发器

            AFTER 语句级触发器

<!-- 正文结束 -->

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23910780/viewspace-1116057/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 没有了~
下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2010-05-14