触发器(自治事务)
来源:互联网 发布:淘宝的淘抢购不见了? 编辑:程序博客网 时间:2024/06/05 14:58
原帖地址http://blog.csdn.net/inthirties/archive/2009/09/15/4550876.aspx 问题如下 表 KSOURCE.USERINFO 发生了变化, 触发器/函数不能读它 解决的方式 就是这里可以通过一些AUTONOMOUS_TRANSACTION(自治事务)来解决 或者是用表级别的trigger和行级trigger搭配,行级trigger做标记,表级别的trigger来做操作。配合着package里的临时变量存储标记。 一下是简单的处理方式,自治事务
UserInfo(UserID,UserName,DepartID,SerialNum,…)
对于一个部门(DepartID相同)下的用户,我要让其序号SerialNum保持连续,就建立了一个触发器:引用:
CREATE OR REPLACE TRIGGER “KSOURCE”.TRUSERINFO_INSERT
AFTER
INSERT ON “KSOURCE”.”USERINFO”
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
Declare
v_SerialNum Number;
Begin
Select Count(*) Into v_SerialNum From UserInfo Where DepartID=:New.DepartID;
if (:New.SerialNum v_SerialNum) Then
Update UserInfo Set SerialNum=v_SerialNum Where UserID=:New.UserID;
end if;
End;
这样,如果用户输入的SerialNum不连续了,自动改成连续的,但Insert时却出现如下提示:
表 KSOURCE.USERINFO 发生了变化, 触发器/函数不能读它
这里为什么会出错了,这里的sql代码一点问题都没有,问题就出在是写在trigger里了。而且是for each row的trigger
行级的触发器代码中不能再操作该表,包括select,默认的在写TRIGGER的时候把本表锁死,不允许对其进行操作,引用:
CREATE OR REPLACE TRIGGER “KSOURCE”.TRUSERINFO_INSERT
AFTER
INSERT ON “KSOURCE”.”USERINFO”
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
Declare
v_SerialNum Number;
PRAGMA AUTONOMOUS_TRANSACTION;
Begin
Select Count(*) Into v_SerialNum From UserInfo Where DepartID=:New.DepartID;
if (:New.SerialNum v_SerialNum) Then
Update UserInfo Set SerialNum=v_SerialNum Where UserID=:New.UserID;
end if;
commit;
End;
你试试这个解决方式叻,不过对于你这case,确实比较复杂,在你delete一条中间的数据时,确实还要控制其他的serialnum也随之发生变化。这样才能保持连续
由于是自治形式的,所以在你的程序块里,最后需要加上commit;
- 自治事务触发器问题解答
- 触发器(自治事务)
- oracle触发器中使用自治事务commit or rollback
- 使用触发器和自治事务做了个DDL审计
- 利用自治事务技术写一个用于审计的触发器
- oracle触发器中增删改查本表 -自治事务
- -自治事务
- 自治事务
- 自治事务
- 自治事务
- 自治事务
- 自治事务
- 自治事务
- 自治事务
- 自治事务
- 嵌套事务,自治事务
- 通过在触发器中建立自治事务解决ORA-04091(不能读取被触发的表)
- 自治事务和变异表的行级触发器部分问题
- windows下和linux下的进程和线程(转)
- 开始整理博客了....
- /PAE AWE and /3GB
- __attribute__机制介绍
- JavaScript 多级联动select
- 触发器(自治事务)
- 测试
- ORACLE实例与数据库详解
- 网页上分享到的实现
- ubuntu网络配置
- Qt Linguis
- 经验谈
- sybase数据库2
- Windbg+VirtualBox调用内核