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

简介: 2014-06-14 Created By BaoXinjian 一、基本概念 触发器是许多关系数据库系统都提供的一项技术。在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块。

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

ERP技术讨论群: 288307890
技术交流,技术讨论,欢迎加入
Technology Blog Created By Oracle ERP - 鲍新建
相关文章
|
9天前
|
Oracle 关系型数据库 数据库
Oracle中merge Into的用法
Oracle中merge Into的用法
|
9天前
|
SQL 存储 Oracle
Oracle系列十四:触发器
Oracle系列十四:触发器
|
7月前
|
缓存 API 流计算
Flink--7、窗口(窗口的概念、分类、API、分配器、窗口函数)、触发器、移除器
Flink--7、窗口(窗口的概念、分类、API、分配器、窗口函数)、触发器、移除器
|
9天前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(上)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
9天前
|
SQL 存储 Oracle
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法(下)
一篇文章带你学会 Oracle 存储过程的基本介绍和高阶用法
|
9天前
|
缓存 Oracle 关系型数据库
Oracle中的触发器与序列:自增列的魔法组合
【4月更文挑战第19天】Oracle数据库中,通过触发器和序列的组合可实现自增列功能。序列充当自动计数器,提供递增数值,而触发器则在插入新记录时自动分配序列值。创建序列如`CREATE SEQUENCE emp_seq START WITH 1 INCREMENT BY 1 NOCACHE`,然后创建触发器`TRIGGER trg_employees_before_insert`在`BEFORE INSERT`时将序列的下一个值赋予`employee_id`。这种方式使得在插入记录时无需手动设置ID,提高了效率。但使用时需注意序列状态、并发性和性能优化。
|
9月前
|
Oracle 关系型数据库
Oracle中decode 以及ROW_NUMBER() OVER() 函数等其它相关函数用法
Oracle中decode 以及ROW_NUMBER() OVER() 函数等其它相关函数用法
83 0
|
9天前
|
SQL 关系型数据库 MySQL
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
⑩⑥ 【MySQL】详解 触发器TRIGGER,协助 确保数据的完整性,日志记录,数据校验等操作。
49 0
|
6月前
|
关系型数据库 MySQL
Mysql Trigger触发器学习总结
Mysql Trigger触发器学习总结
30 0
|
7月前
|
SQL 存储 Oracle
Oracle触发器----你会教对象触发嘛
Oracle触发器----你会教对象触发嘛

推荐镜像

更多