Oracle触发器(trigger):一般用法
trigger和procedure,function类似,只不过它不能被显示调用,只能被某个事件触发然后Oracle自动去调用.常用的一般是针对一个表或视图创建一个trigger,然后对表或视图做某些操作时触发trigger.当然除此之外还有,schema,database级别的trigger.
什么样的操作触发trigger
常见的是DML(insert,update,delete) , DDL(create,alter,drop)语句.
不常见的是schema级别trigger在session连接或断开时触发.database级别trigger在系统启动或退出时触发.
你可能很容易发现如果是select查询操作就没法用到trigger,而有时可能我们想监测谁查看了一些敏感信息,此时只能用到一个叫FGA的东东,可以创建一个审计策略(可以看成加强版的trigger,FGA介绍详见: http://www.linuxidc.com/Linux/2013-06/86603.htm )
使用触发器注意事项
1.触发器不接受参数,一个表最多可有12个触发器(触发器类型刚好是12种),并且同一时间,同一事件,同一类型的触发器只能有一个(保证触发器操作不冲突嘛).
2.触发器最大为32KB,由于大小受到限制自然也不能使用long,blob这样的大变量.如果实在是有复杂的逻辑,要弄个很复杂的触发器,可以通过procedure或function实现一部分功能,然后调用
3.因为触发器实际上可以看作触发语句的一部分.所以得遵循一些约束条件,比如不能有事务控制语句(commit,rollback,savepoint),DDL语句.为啥子呢,这些特殊语句与一般sql语句的最主要区别是涉及到commit的问题.所以如果触发语句只是一般语句的话自然不能因为trigger的操作带有commit这样的特性了.
创建触发器
针对表或视图的触发器格式如下:
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER }
{INSERT | DELETE | UPDATE [OF column [, column …]]}
[OR {INSERT | DELETE | UPDATE [OF column [, column …]]}...]
ON [schema.]table_name | [schema.]view_name
[REFERENCING {OLD [AS] old | NEW [AS] new| PARENT as parent}]
[FOR EACH ROW ]
[WHEN condition]
PL/SQL_BLOCK | CALL procedure_name;
先来看一个简单的,statement级别的trigger怎么创建.假如有表tb1,每insert一点就通过trigger在tblog中记录一些信息.
create or replace trigger tb1_trigger
after insert on tb1
referencing new as new old as old
declare
v_info varchar2(100);
begin
v_info := "do a insert";
insert into tblog(info) values(v_info);
end;
trigger的创建中有个不太容易理解的内容:一针对row级别的trigger旧值新值问题
row级别trigger旧值新值
针对一个表或视图创建trigger时分为statement级别与row级别的trigger.所谓statement级别是说一个sql语句触发一次trigger,而如果是row级别则一个sql语句涉及到多行数据则trigger会被触发多次.
而旧值就是指要更改的那一行数据在被改之前的值,新值就是用户更新后值.假如表tt只有一列一行数据:88.然后用户执行语句update tt set id = 99 where id = 88;
则旧值指88,新值指99.那你们可能会问用什么方式去得到旧值或新值啊.来举例看下
假如有表tb(eno int); 和表tblog( info varchar2(100)); 假如在tb上创建trigger,tb每update一次则在tblog中记录旧值就更改后的新值.
CREATE OR REPLACE TRIGGER tb_trigger
BEFORE UPDATE
ON tb
REFERENCING NEW AS new_val OLD AS old_val --在这里设置名字,然后可引用新值,旧值.如果不指定默认值为new ,old.可以通过:new或:old去引用
FOR EACH ROW
DECLARE
v_info varchar2(100);
BEGIN
v_info := 'old value:' ||to_char( :old_val.eno) || 'new value:' || to_char(:new_val.eno);
insert into tblog values(v_info);
END;
条件判断
假如只有在涉及到某一行的操作时触发trigger,假如该触发器是针对updat,delete,insert都触发的情形.咋整呢,自然是多用些when去判断啊.
例如
CREATE OR REPLACE TRIGGER tb_trigger
BEFORE UPDATE or insert or delete
ON tb
REFERENCING NEW AS new_val OLD AS old_val --在这里设置名字,然后可引用新值,旧值
FOR EACH ROW
when (old_val.eno = 99)
DECLARE
v_info varchar2(100);
BEGIN
case
when updating then
v_info := 'old value:' ||to_char( :old_val.eno) || 'new value:' || to_char(:new_val.eno);
insert into tblog values(v_info);
when inserting then
null;
when deleting then
null;
end case;
END;
Oracle触发器(trigger):一般用法相关推荐
- Oracle 触发器trigger介绍
一.触发器定义 Oracle触发器是使用者对Oracle数据库的对象做特定的操作时,触发的一段PL/SQL程序代码器.触发的事件包括对表的DML操作,用户的DDL操作以及数据库事件等. 二.触发器分类 ...
- [转载]Oracle触发器用法实例详解
本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...
- Oracle Study之--Oracle触发器(Trigger)
本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...
- oracle 数据库 触发器 trigger 语法
http://shixm.iteye.com/blog/401564 关键字: oracle 数据库 触发器 trigger 语法 语法规则: Create [or replace] trigger ...
- oracle 触发器用法,Oracle触发器用法实例详解
本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...
- SQL server与Oracle触发器的创建与使用
SQL Server 1创建触发器 GO BEGIN IF (object_id('WMY', 'tr') is not null) DROP trigger WMY END; GO CREATE T ...
- oracle触发器高级教程
[转自]http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_7004.htm#i2153503 CREA ...
- oracle 停止触发器语句,oracle触发器语句
ORACLE中触发器的判断IF语句 加一行 NULL 即可例如:SQL> DECLARE 2 testvalue INT; 3 BEGIN 4 testvalue := 200; 5 6 IF ...
- oracle触发器 触发事件,oracle 触发器的种类和触发事件
oracle触发器的种类和触发事件,DML触发器,DDL事件触发器,替代触发器,查看触发器 触发器的种类和触发事件 触发器必须由事件才能触发.触发器的触发事件分可为3类,分别是DML事件.DDL事件和 ...
最新文章
- 老王Python-进阶篇4-异常处理1.3(周末习题)
- 徐波所长专访 | 人工智能:从“作坊式”走向“工业化”新时代
- 级联下拉框效果,动态加载图片
- delphi 读取ini所有项_财务机器人真的会代替财务人员所有工作吗?
- Spring Bean的生命周期(详细)
- C++ unordered_map 使用详解(含C++20新特性)
- Insider Dev Tour 2019 全球巡演 苏州站
- Overview of ISA and TMG Networking and ISA Networking Case Study (Part 2)
- 观察者模式与职责链模式的相同和不同_GOF设计模式(策略模式,职责链模式)...
- KORG Polysix for mac(四VCO单声道/多声道合成器)
- Properties文件操作
- C# 操作Gmap简单使用方法
- visio中公式太小_多元醇羟值、羟基含量与分子量之间的关系及计算公式
- centos 6.8 请教笔记本上的虚拟机如何配置无线网络 桥接联网
- 员工转正述职答辩问什么问题_转正答辩会问什么问题?
- html背景图片 纵向拉伸,背景图片拉伸(CSS方法)_html/css_WEB-ITnose
- C#迭代器的详细用法
- 南京大学软件工程842参考书攻略
- Solaris 10u11 安装python2.7.10
- Android-掷骰子
热门文章
- 来吧!我教你画真正的流程图
- PMcaff茶话会 · 杭州 | 玩转社交产品的那些事儿
- 高级PM分析足记的成长周期,你的产品距离火爆还有多久?
- 【专访】PP租车张丙军:“打虎亲兄弟“,好团队才能书写互联网传奇
- UIButton 的 imageEdgeInsets 和 titleEdgeInsets
- 个人的小项目mysql_mgr_test开放了
- NetBeans 7 Python 又回来了
- VMware View 4.0 测试-7
- windows server 2003中继代理
- 第十届蓝桥杯JavaB组总结