Oracle触发器(trigger):view,schema,database
视图trigger, instead of
我们知道如果一个view只是由一个table构成,那在view上做啥操作没太多限制.如果view是由多个table组成那在view上做啥unpdate,insert,delete都会出错.但有时又确实要做这些操作该咋办呢.这就需要用到trigger,然后通过instead of关键字来指定一些替代操作.
举个简单例子,如果有view, my_view创建trigger如下
create or replace trigger my_view_trigger
instead of insert or update
on my_view
declare
insert into tmp(eno) values(:new.eno);
end;
当执行sql : insert into my_view(eno, name) values(88,'test');时触发trigger.
不过view的instead of类型的trigger相对其他类型trigger有个特别的地方.从名字也可以看出来,可以替换掉了触发它的sql的操作.也就是insert into my_view(eno, name) values(88,'test');这个sql本身的操作不会起作用了.只有trigger里面的pl/sql语句块才真正执行.
注意事项:
1.instead of 类型触发器只能针对view创建,并且该view上不能有些check option(比如with check read only之类的),这以所这样是防止不同的功能之间的冲突.假如是一个read only类型的view,那自然不能整出个trigger又可以做些DML操作了.
2.不能指定before或after选项,因为触发trigger的sql实际上并不会执行,所以before或after就没有啥意义了.
Database , Schema级别trigger
针对表和视图的Triggers可能开发人员用的多.针对database,schema的Trigger一般是DBA用的多点.
比如创建trigger每当schema上有DDL操作时触发(针对表或视图的trigger只能针对DML操作,不能针对DDL操作).
举个简单的例子
CREATE OR REPLACE TRIGGER ddl_trigger
AFTER DDL ON SCHEMA
BEGIN
insert into tblog values(systimestamp,ora_sysevent, ora_login_user,
ora_dict_obj_type, ora_dict_obj_name);
END;
其中ora_login_user是登陆名,ora_dict_obj_type对象类型(比如表或视图),ora_dict_obj_name是对象名字,比如表名或视图名.你可能看到这些变量貌似没在哪里定义.实际上是oracle定义好的,你只要拿来用就行.
假如随便用哪个用户执行如下sql: create table tmp_tb(eno int); 就会触发trigger.
不过貌似上面不能直接指定是具体的哪个schema,只能针对所有schema了啊.
假如用户每次登陆时要做些记录.那可以创建如下trigger
CREATE OR REPLACE TRIGGER logon_trigger
AFTER LOGON ON DATABASE
BEGIN
INSERT INTO tblog VALUES (ora_login_user, ora_client_ip_address, systimestamp);
END ;
这里的logon on database不是说数据库启动,而是每次连接一个session的时候.
Oracle触发器(trigger):view,schema,database的更多相关文章
- Oracle触发器(trigger):一般用法
trigger和procedure,function类似,只不过它不能被显示调用,只能被某个事件触发然后oracle自动去调用.常用的一般是针对一个表或视图创建一个trigger,然后对表或视图做某些 ...
- Oracle触发器Trigger基础1
/* Trigger是作用在表上,或是数据库上,或是用户上.当用户在表上(其他)做某些操作时,trigger将会自己执行. 可以在表上:insert,update,delete Trigger只对表的 ...
- Oracle 触发器 trigger
触发器: 当用户登录/退出或者操作某个数据对象或者进行DDL(建表,建view)引起某个储存过程的值的变化,把这个隐含被调用的过程,称为触发器. 语法 CREATE OR REPLACE TRIGGE ...
- 【database】oracle触发器基础
一.oracle触发器基本语法 CREATE [OR REPLACE] TRIGGER trigger_name {BEFORE | AFTER } {INSERT | DELETE | UPDATE ...
- oracle:触发器,自治事务 trigger
create or replace trigger TRI_FC83_INSERT before insert ON FC83 FOR EACH ROW declare PRAGMA AUTONOMO ...
- Oracle触发器原理、创建、修改、删除
本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创建DML触发器 8.2. ...
- ORACLE 触发器
•1.1 触发器类型 • DML触发器 • 替代触发器 • 系统触发器 •1.2 创建触发器 • 触发器触发次序 • 创建DML触发器 • 创建替代(INSTEAD OF)触发器 • 创建系统事件触发 ...
- (转)ORACLE触发器详解
本文转载自:http://blog.csdn.net/indexman/article/details/8023740/ ORACLE PL/SQL编程之八: 把触发器说透 本篇主要内容如下: 8.1 ...
- oracle触发器详解(转)
触发器是许多关系数据库系统都提供的一项技术.在ORACLE系统里,触发器类似过程和函数,都有声明,执行和异常处理过程的PL/SQL块. 8.1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过 ...
随机推荐
- php正则的使用[替换,匹配]
// 隐藏电话的中间四位 echo parseMobile('15836365252'); function parseMobile($mobile, $start = 4, $len = 4){ $ ...
- PHP利用递归法获取多级类别的树状数组
数据结构:category(id, pid, name),对应:信息ID,父项ID,类别名 测试数据: $aryCate = array( array('id' => 1, 'pid' => ...
- linux 程序运行监控
一 . 使用supervise 是daemon-tools 的一个功能,系统的守护进程.在进程挂掉的时候可以自动重启. 二 安装 wget http://cr.yp.to/daemontools/ ...
- CentOS 七 vs CentOS 6的不同
CentOS 七 vs CentOS 6的不同 CentOS 7 vs CentOS 6的不同(1)桌面系统[CentOS6] GNOME 2.x[CentOS7] GNOME 3.x(GNOME ...
- java多线程向数据库写入数据
任务: 从sqlserver中将一个表A(约16W条数据)导到mysql中对应的一个表B中. 思路:分段获取A表中的数据后,用多个线程同时向B表中写入. 关键代码 //将数据库中的数据条数分段 pub ...
- 对应第一篇文章api的编写
router.get('/api/tags/search/:list/:key/:page', function(req, res) { if(_.isEmpty(req.params.key)) { ...
- Solrj日期范围查询
在做依据日期来检索的时候普通的格式化会出错,试了好多种仅仅有一种可行 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH ...
- Java操作mongoDB2.6的常见API使用方法
对于mongoDB而言,学习方式和学习关系型数据库差不太多 開始都是学习怎样insert.find.update.remove,然后就是分页.排序.索引,再接着就是主从复制.副本集.分片等等 最后就是 ...
- C# 文件帮助类
using System; using System.Data; using System.Configuration; using System.Linq; using System.Web; us ...
- FilenameUtils工具类
转载请出自出处:http://eksliang.iteye.com/blog/2217081 一.概述 这是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的 ...