1、初始目标
在对表h1插入一条数据时,同时插入一条重复的数据(只有主键不同)
2、在PL/SQL里New一个Trigger或者手动敲入代码
先说明一下,表h1包括4列ID、C1、C2、C3
create or replace trigger Trigger_Test
after insert on h1
for each row
declare
--variables
begin
insert into h1 values(:new.C1, :new.C2, :new.C3, :new.ID);
end Trigger_Test;
3、F8编译通过,新建一个窗口执行insert窗口,测试trigger是否有效,用了一个名为sequence_test的序列:
insert into h1 values('aa','bb','cc',sequence_test.nextval);
报错:表h1发生了变化,触发器/函数不能读。
4、网上搜的说法是“触发器不能修改触发表的数据,除非使用自治事务”,OK那就用自治事务:
declare
--variables
//改为:
declare
pragma autonomous_transaction;
再试报错:等待资源时检测到死锁。仔细一查,哦原来是目标有问题,Insert连着Insert,无限循环,不是资源死锁就是内存不足或者栈溢出。
5、目标更新为:在对表h1插入一条数据时,同时插入一条相同的数据到历史表里,把trigger里的insert修改为:
insert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);
再跑又报错:检测到活动的自治事务处理,已经回退。
6、网上接着搜,说是有事务没提交。其实这是之前目标设定有问题,触发器一般不会修改触发表,用了自治事务,就要commit;如果是插入历史表,可以都不加。
declare
pragma autonomous_transaction;
commit;
delete from h1 where ID = 1;
commit;
//如果不操作触发表,则可以去掉自治事务的这一串声明
declare
insert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);
7、小结
Trigger在修改其他表(非触发表)的时候,最方便,直接像写存储过程即可;
若要使用Trigger修改触发表的数据,需要配合使用自治事务并commit,比较麻烦;
对新操作的记录本身(比如新Insert/Update/Delete的数据),无法做修改,并且如果强行修改的话,既不会报错,也没有效果。
【Oracle】详解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
https://blog.csdn.net/indexman/article/details/8023740/ https://www.cnblogs.com/sharpest/p/7764660.h ...
oracle中利用trigger,sequence自动生成ID
http://zhanghong.iteye.com/blog/865937 1. 首先创建数据库表 SQL> create table customer( 2 id number(8) no ...
在Oracle中使用Entity Framework 6 CodeFirst
项目中需要将系统从SQLServer数据库迁移到Oracle上.由于原大部分数据访问操作都是通过包装了Entity Framework的统一访问入口实现的,所以需要研究Entity Framework ...
oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
Oracle中的自动增长字段
Oracle中的自动增长字段 Oracle 中不像MYSQL 和MSSQLServer 中那样指定一个列为自动增长列的方式,不过在Oracle中可以通过SEQUENCE序列来实现自动增长字段. 在Or ...
Oracle中HWM与数据库性能的探讨
Oracle中HWM与数据库性能的探讨 一.什么是高水位 HWM(high water mark),高水标记,这个概念在segment的存储内容中是比较重要的.简单来说,HWM就是一个segment中 ...
oracle中有关用户、角色的一些概念。
oracle中的每个用户对应一个单独的方案(schema),方案的名字与用户名一样,方案中包含很多数据对象,表,视图,触发器,存储过程等元素. oracle中管理数据库的角色有sys,system,数 ...
oracle中imp命令具体解释
oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/pass ...
随机推荐
错误400-The request sent by the client was syntactically incorrect
springMVC中,某个页面提交时报400错误,如下图. 解决方法: 1.在网上找了一下,答案是通常遇到这个错误是因为前端jsp页面的控件名称和controller中接收的参数名称不一致.但 ...
jQuery form表单序列化为JSON对象!
/* 来源于博客园http://www.cnblogs.com/nixil/archive/2010/12/08/1900745.html */ function paramString2obj(se ...
mysql 查询优化
不说话,先贴代码 public PageResult getLargeList(BaseCondition baseCondition) { PageResult< ...
怎样从altera下载软件与器件库
首先要注册一个帐号,否则是不能下载的. step1:进入support->download 这是页面下方的显示,可以选择想要安装的Quartus版本以及该版本支持的器件.这里以16.0标准版为例 ...
django数据库动态添加列
方法一: python manage.py migrate 方法二: python manage.py migrate 效果: ---〉
x5设置经典门户登录
runtime\UIServer\index.jsp java.lang.String url = request.getContextPath() + "/portal2/proces ...
ASP.NET C#_HTML练习
1. textarea和的区别是什么? 前者是多行输入框,后者是单行输入框 2. 如何让下拉框菜单支持多选?
nmap 使用脚本引擎进行扫描
1.下载nmap(nmap官网). 2.安装nmap. 3.编辑环境变量(windows下所需),保存.
设置Cookie,登录记住用户登录信息,获取用户登录过得信息
function setCookie(name,value) { var Days = 30; var exp = new Date(); exp.setTime(exp.getTime() + Da ...
jQuery 对象与Dom 对象互转
jQuery 对象与Dom 对象互转: $obj --[i],get(i)-->obj --$(obj)-->$obj; obj--$($(obj))-->$obj,多包装了也是$o ...