JavaEE开源博客-阿Q

        ~用心做事,诚信做人!以德为本,兼顾各方!细心观察,联系推理!
        ~遵守规范->重构->可复用代码->可扩展性 *大道至简*
        ~时间是挤出来的,要成功,你就必须在最短的时间内采取最大量的行动!坚持到底,看到的就是胜利!再低下、再简单、再不愿意做的事情,你也要把它当成自己的事业做好!以马内利,阿们!

公告

我的分类(专题)

最新日志

最新评论

留言簿

搜索

登陆

友情连接

统计

2008-5-29 2:06:00
Oracle触发器

触发器是一些过程,当发生一个特定的数据库事件时就执行这些过程。可以使用触发器来扩充引用的完整性、实施附加的安全性或增强可用的审计选项。

触发器可用于下列情况

l         维护在表创建阶段通过声明限制无法实现的复杂完整性限制。

l         通过记录修改内容和修改者来审计表中的信息。

l         在表内容发生变更时,自动通知其他程序采取相应的处理。

l         在订阅发布环境下,发布有关各种事件的信息。

 

一、触发器的类型

可以使用触发器来加强比正常的引用完整性约束条件更复杂的数据约束,Oracle能够把触发器扩展到除了在表或视图上进行DML操作以外的事件。

触发器是在事件发生时隐式地运行的,并且触发器不能接收参数。

4种主要的触发器类型DML触发器、替代触发器、系统事件触发器和DDL触发器。

l         DML触发器

DML触发器是目前使用最广泛的触发器。DML触发器就是由DML语句激发的触发器,并且该语句的类型决定DML触发器的类型。

    BEFORE触发器即在该事件发生之前采取行动,AFTER触发器即在该事件发生之后执行。

    除此之外,它们也可以在行或语句操作上激发。语句触发器是对每一个触发语句触发一次。行触发器是对受语句影响的表中的每一行触发一次。

 

l         替代触发器

替代触发器又叫Instead of触发器,执行一个替代操作来代替触发器的操作。与DML触发器不同,DML触发器是在DML操作之外运行的,面而替代触发器则代替激发它的DML语句运行。替代触发器是行一级的,也就是说,如果对表创建一个 INSTEAD OF INSERT触发器,对于每个对表的INSERT操作,将执行触发器的代码,且绝不会出现引起触发器执行insert操作。

 

l         系统事件触发器

这种系统触发器在发生如数据库启动或关闭等系统事件时激发,而不是在执行DML语句时激发。系统事件触发器共支持5种系统事件:

1.       SERVERERROR 当服务器发生错误的时候,可以生成触发器

2.       LOGON 当用户对数据库登录后,可以生成触发器

3.       LOGOFF 当用户从数据库注销前,可以生成触发器

4.       STARTUP 数据库打开后,马上生成触发器

5.       SHUTDOWN 不论实例在何时被关闭,都可以生成触发器

 

l         DDL触发器

DDL触发器是针对于对模式对象有影响的CREATEALTERDELETE等语句的。可以做在这些操作之前或之后来定义DDL触发器。

 

 

二、建立触发器

所有触发器,不管其类型如何,都可以使用相同的语法创建。下面是创建触发器的通用语法:

    CREATE [OR REPLACE] TRIGGER 触发器名称

    [BEFORE | AFTER | INSTEAD OF] 激发触发器事件

    referencing_clause

    [WHEN trigger_condition]

    [FOR EACH ROW]

 

DML触发器的例子,用于对表Table1进行DML操作(插入、更新和删除)之后,在日志表TabLog1中进行记录。

CREATE OR REPLACE TRIGGER WriteLog

    AFTER INSERT OR UPDATE OR DELETE

    ON Table1

    FOR EACH ROW

DECLARE

    StatementType CHAR(1);

BEGIN

    If INSERTING then

        StatementType:=’I’;

    elsif UPDATING then

        StatementType:=’U’;

        else

        StatementType:=’D’;

        end if;

INSERT INTO TabLog1 VALUES(StatementType, USER, SYSDATE);

END WriteLog;

/

效果如图:

 

 

 

 

 

下面是一个系统事件触发器的例子,对应于LOGON事件,将登录时间、用户、登录数据库记录在表conn_log中。

DROP TABLE conn_log;

CREATE TABLE conn_log(

timestamp DATE,

username VARCHAR2(30),

database_name VARCHAR2(50)

);

   

    CREATE OR REPLACE TRIGGER LogConnects_Record

        AFTER LOGON ON DATABASE

    BEGIN

        INSERT INTO conn_log

        VALUES(SYSDATE, SYS.LOGIN_USER, SYS.DATABASE_NAME);

    END LogConnects_Record;

效果如图(点击放大图片):

 

 

下面是一个DDL型的触发器,它在用户创建数据库对象时将创建信息写入表ddl_creations

DROP TABLE ddl_creations;

    CREATE TABLE ddl_creations(

    user_id VARCHAR2(30),

    object_type VARCHAR2(20),

    object_name VARCHAR2(30),

    object_owner VARCHAR2(30),

    creation_date DATE

);

 

CREATE OR REPLACE TRIGGER WriteDDLCreations
    AFTER CREATE ON DATABASE
BEGIN
    INSERT INTO ddl_creations(user_id, object_type, object_name,
      object_owner, creation_date)
      values(USER, SYS.DICTIONARY_OBJ_TYPE,
      SYS.DICTIONARY_OBJ_NAME, SYS.DICTIONARY_OBJ_OWNER, SYSDATE);
END WriteDDLCreations;

/

 

 

个人博客: http://zhan.zhmy.com/

 

posted @ 2008-5-29 2:06:00 sam 阅读全文 | 回复(0) | 引用通告 | 编辑
  • 标签:触发 触发器 oracle 数据库 dml ddl 
  • 发表评论:
    网志中国数据载入中...