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://blog.csdn.net/weiwenhp/article/details/7165660)
使用触发器注意事项
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):view,schema,database
视图trigger, instead of 我们知道如果一个view只是由一个table构成,那在view上做啥操作没太多限制.如果view是由多个table组成那在view上做啥unpdate,in ...
- Oracle触发器Trigger基础1
/* Trigger是作用在表上,或是数据库上,或是用户上.当用户在表上(其他)做某些操作时,trigger将会自己执行. 可以在表上:insert,update,delete Trigger只对表的 ...
- Oracle 触发器 trigger
触发器: 当用户登录/退出或者操作某个数据对象或者进行DDL(建表,建view)引起某个储存过程的值的变化,把这个隐含被调用的过程,称为触发器. 语法 CREATE OR REPLACE TRIGGE ...
- oracle入坑日记<六>自增列创建和清除(含序列和触发器的基础用法)
0 前言 用过 SQLserver 和 MySQL 的自增列(auto_increment),然而 Oracle 在建表设置列时却没有自增列. 查阅资料后发现 Oracle 的自增列需要手动编写. ...
- Oracle触发器用法实例详解
转自:https://www.jb51.net/article/80804.htm. 本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件 ...
- [转载]Oracle触发器用法实例详解
本文实例讲述了Oracle触发器用法.分享给大家供大家参考,具体如下: 一.触发器简介 触发器的定义就是说某个条件成立的时候,触发器里面所定义的语句就会被自动的执行. 因此触发器不需要人为的去调用,也 ...
- oracle:触发器,自治事务 trigger
create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMO ...
- mysql 触发器 trigger用法 two (稍微复杂的)
触发器(trigger):监视某种情况,并触发某种操作. 触发器创建语法四要素:1.监视地点(table) 2.监视事件(insert/update/delete) 3.触发时间(after/befo ...
- oracle触发器应用
首先给大家推荐两篇我看后的博文,我已经内容转载过来: 1.对触发器的讲解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建 ...
随机推荐
- repo 原理
Android源代码工程用repo来进行管理,本质是多个git仓的整合. 感谢https://blog.csdn.net/stoic163/article/details/78790349 1.Gen ...
- SSM框架简介及整合教程
1.Spring Spring 框架是 Java 应用最广的框架,它的成功来源于理念,而不是技术本身,它的理念包括 IoC (控制反转) 和 A面向切面编程).Spring框架是个轻量级的Java E ...
- Python 面向对象基础(类、实例、方法、属性封装)
python是面向对象语言,一切皆对象. 面向过程: 变量和函数. “散落” 在文件的各个位置,甚至是不同文件中.看不出变量与函数的相关性,非常不利于维护,设计模式不清晰. 经常导致程序员,忘记某个变 ...
- IDEA2017-破解方法
@方法一 第一步:下载jar 包 地址:https://github.com/locationbai/registerIDEA_2017.3.2_jar 第二部:将下载好的jar放在idea安装目录下 ...
- char、varchar、nchar、nvarchar的区别(转)
转自:http://tech.diannaodian.com/dw/data/sql/2011/1005/135556.html 对于程序中的string型字段,SQLServer中有char.var ...
- c3p0的几种使用方式(原文地址: https://my.oschina.net/liangtee/blog/101047)
package com.c3p0.test; import java.sql.Connection; import java.sql.SQLException; import java.beans.P ...
- WOPI的安装文档方法
Office Web Apps安装部署 系统要求为Windows Server 2012, 注意:安装Office Web Apps的服务器除了Office Web Apps之外,不能安装其他应用.包 ...
- 六:python 对象类型详解二:字符串(下)
一:字符串方法: 方法就是与特定对象相关联在一起的函数.从技术的角度来讲,它们是附属于对象的属性,而这些属性不过是些可调用的函数罢了.Python 首先读取对象方法,然后调用它,传递参数.如果一个方法 ...
- httpclient使用用例
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import jav ...
- Codeforces Beta Round #32 (Div. 2, Codeforces format)
Codeforces Beta Round #32 (Div. 2, Codeforces format) http://codeforces.com/contest/32 A #include< ...