PLSQL_Oracle Trigger触发器的基本概念和用法

2014-06-14 Created By BaoXinjian

一、基本概念


触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行。即触发器是当某个事件发生时自动地隐式运行。并且,触发器不能接收参数。所以运行触发器就叫触发或点火(firing)。ORACLE事件指的是对数据库的表进行的INSERT、UPDATE及DELETE操作或对视图进行类似的操作。ORACLE将触发器的功能扩展到了触发ORACLE,如数据库的启动与关闭等。所以触发器常用来完成由数据库的完整性约束难以完成的复杂业务规则的约束,或用来监视对数据库的各种操作,实现审计的功能。

1. 触发器事件:insert, update, insert

2. 触发时间: after, before

3. 触发参数: :old和:new 

    (1). delete 只有:old 

    (2). insert 只有:new 

    (3). update 同时存在:old 和:new 

4 触发层级:行级触发器,语句级触发器 

    (1). 行级触发器是加入了for each row 

    (2). 语句级触发器不需要for each row 

    只有应该了for each row才会有:old 或者:new 

5. 其他 

    (1). 触发器是不能使用rollback

    (2). 触发器抛出异常:raise_application_error('-2000','不能删除');  -20999到-20000

6. 触发器的主要作用

  • 1、 允许/限制对表的修改
  • 2、 自动生成派生列,比如自增字段
  • 3、 强制数据一致性
  • 4、 提供审计和日志记录
  • 5、 防止无效的事务处理
  • 6、 启用复杂的业务逻辑

7. 触发器的组成部分:

  • 触发器名称
  • 触发语句
  • 触发器限制
  • 触发操作

8. 触发器的类型

  • 语句触发器
  • 行触发器
  • INSTEAD OF 触发器
  • 系统条件触发器
  • 用户事件触发器

 

二、触发器的结构


触发器的组成部分:

  • 触发器名称
  • 触发语句
  • 触发器限制
  • 触发操作

1. 触发器名称

create trigger biufer_employees_department_id

命名习惯:

biufer(before insert update for each row)

employees 表名

department_id 列名

2. 触发语句

表或视图上的DML语句 或DDL语句

数据库关闭或启动,startup shutdown 等等

before insert or update

of department_id

on employees

referencing old as old_value

new as new_value

for each row

说明:

(1) 无论是否规定了department_id ,对employees表进行insert的时候

(2) 对employees表的department_id列进行update的时候

3. 触发器限制

when (new_value.department_id<>80 )

限制不是必须的。此例表示如果列department_id不等于80的时候,触发器就会执行。

其中的new_value是代表更新之后的值。

4. 触发操作

是触发器的主体

begin

       :new_value.commission_pct :=0;

end;

主体很简单,就是将更新后的commission_pct列置为0

触发器不会通知用户,便改变了用户的输入值。

 

三、具体案例 - 使用最多的行级出发器


案例:当表进行增删改后输出信息,以监控表的增删

1. 行级触发器 

 1 CREATE OR REPLACE TRIGGER test_trigger                               
 2    AFTER INSERT OR DELETE OR UPDATE 
 3    ON xxgl_test_je_headers  
 4    FOR EACH ROW                            
 5 BEGIN                                                           
 6    IF INSERTING 
 7    THEN 
 8       DBMS_OUTPUT.put_line ('I'); 
 9       DBMS_OUTPUT.put_line ('insert batch_id='||:new.je_batch_id); 
10    ELSIF UPDATING 
11    THEN 
12       DBMS_OUTPUT.put_line ('U'); 
13       DBMS_OUTPUT.put_line ('update old batch_name='||:old.batch_name); 
14       DBMS_OUTPUT.put_line ('update new batch_name='||:new.batch_name); 
15    ELSIF DELETING 
16    THEN 
17       DBMS_OUTPUT.put_line ('D'); 
18       DBMS_OUTPUT.put_line ('delete batch_id='||:old.je_batch_id);    
19    END IF; 
20 END; 

 2. Create 测试该触发器

 3. Update 测试该触发器

   

 4. Delete 测试该触发器

 

 

Thanks and Regards

posted on 2014-06-14 18:17  东方瀚海  阅读(6399)  评论(1编辑  收藏  举报