oracle问题,比较麻烦的问题,高手们进来坐下聊聊看怎么办好.

bzszp 2002-02-01 03:02:19
有这样一个问题,我一时想不出解决的好办法,请大家集思广益,帮帮兄弟
表A(a_no),B(a_no,b_no),C(a_no,c_no)括号里的为主键
(A为单表,B,C都为多表) 它们之间用a_no来联系起来,A,B,C会同时发生update,现在需要当A表的某字段发生变化时,把与发生变化的那一条相关的B,C表中的纪录都更新到另两个表中,现在A,B,C三个表的变化顺序不能变换,顺序就是ABC,我一直想用触发器来实现,但不知道用C表的update事件触发好不好用,关键是C为多表,A变化一条,C有可能多条变化,请各位给想个办法,不用触发器用别的方法能解决就行.
...全文
148 点赞 收藏 21
写回复
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
baresi 2002-02-01
占个位置
回复
net_steven 2002-02-01
能用触发器实现的,也肯定能用sp实现,并且显式启用事务,比触发器可靠,
反正更新A表时客户端都要送sql语句或调用sp,就用sp吧。
慎用触发器,是经验之谈。
回复
alldog 2002-02-01
那就每张表写个update触发器喽

回复人: bzszp(蝎子) (2002-2-1 16:44:32) 得0分
alldog(芸芸众生):
这样能行么?你在B的update里建触发器,然后还能对刚更新的数据进行操作么?

可以哑,用before触发器,不锁定记录
回复
bzszp 2002-02-01
A,B,C三表的更新不是我来控制的,更新顺序也不是我能控制的,怎样把三表中的新数据传到另外三个表中,注意B,C两表是多表.
回复
alldog 2002-02-01
妮的问题不是很清楚,所以只能给妮简单的思路
或者妮把代码全部写在A表的update触发器里,先更新B表,再把更新过的B表相应记录添加到另外一张表, C表同样炮制
回复
bzszp 2002-02-01
好吧,我在描述一遍:
实现目的:把刚更新的表数据update到外3个表中(结构相似),
问题:三个表的更新顺序不能变(原表)a,b,c,当a更新时,b,c两表的数据还未更新,所以此时若用触发器传递bc两表的数据是不行的(旧数据),如果是a最后更新的话就能够实现,问题就在这里,不知道我说的明不明白.
回复
hawkcai 2002-02-01
to Dsoul(由MSSql弱智到Oracle弱智) 兄:
不好意思,因为我这边实际工作的环境不同,因此我通常都很少考虑直接用update命令去更新基表的数据,我在上面所说的是我以前曾经因为做一个delete的触发器犯下了一个大错误,所以才想提醒你对数据修改的慎重。
回复
easy_free 2002-02-01
建议尽量采用server端的sp运行, trigger当然最好, 对复杂的可以加入procedure实现

你的问题可以再描述清楚些
回复
bzszp 2002-02-01
alldog(芸芸众生):
这样能行么?你在B的update里建触发器,然后还能对刚更新的数据进行操作么?
回复
alflor 2002-02-01
那就多写几条sql语句吧!
回复
alldog 2002-02-01
在tr_b中insert 后update a set flag=0 where a_no=v_no
还有b表本身的更新问题, 妮自己想一下,应该不难
回复
alldog 2002-02-01
妮看这样行不??
给A 加个字段,用来辨别是否已经实现B、C 表更新, 思路如下:
create or replace trigger tr_A
after update of a_no on A
as
begin
--0 表示A未UPDATE,1表示A已UPDATE
alter table a add flag number(1) default(0) not null;
end;
--更新B到另外一张表
create or replace trigger tr_B
before update on B
declare
v_no number;
cursor ano_cur is
select a_no from A
where flag=1;
begin
open ano_cur;
loop
fetch ano_cur into v_no;
exit when ano_cur%notFound;
insert into other_b select * from B where a_no=v_no;
end loop;
end;
C表更新到另一张表同B表
回复
bzszp 2002-02-01
abc三个表都要update,a表最先update,a表update时,b,c表中的数据还没更新呢,这样是肯定不行的.
回复
panther_totem 2002-02-01
我也来看看。
回复
Dsoul 2002-02-01
我通常习惯用存储过程.灵活.另外,'花'兄说用前台我是不同意的.
第一,数据库改了,你前台要都改,都重装.
第二,前台队数据库操作的权限最好小一些.(这是数据库设计里面提及的)
回复
alldog 2002-02-01
当A update市,b,c还没进行update
~~~~
什么意思哑??
在A update时用触发器把B,C的表更新到另两张表不可以吗??
回复
bzszp 2002-02-01
在程序中实现当然好,但是程序已经固定死了,关键是不能用单表A的update事件触发,当A update市,b,c还没进行update.
回复
alldog 2002-02-01
在别的方法都行不通时,再考虑触发器, 不知道妮要实现的是不是如此简单
create or replace procedure ABC_update(
v_no)
as
begin
insert into other_b select * from B where a_no=v_no;
insert into other_c select * from C where a_no=v_no;
end ABC_update;
回复
bzszp 2002-02-01
oldwain(老斗):
既然是"当A表的某字段发生变化时,把与发生变化的那一条相关的B,C表中的纪录都更新",
自然应该在"A的update事件触发".
关键是BC表的update在A表之后,这样传的多表数据就是旧数据.
C是多表,用C表触发(不用for each row)不会出现什么问题吧,比如两个用户同时更新A,B,C.
再说这样实现起来比较麻烦啊

回复
oldwain 2002-02-01
不知你为什么会有"但不知道用C表的update事件触发好不好用"的想法.


既然是"当A表的某字段发生变化时,把与发生变化的那一条相关的B,C表中的纪录都更新",
自然应该在"A的update事件触发".

"不用触发器用别的方法", 用一个存储过程来实现当然也是可以的.


===========================
oldwain
---------------------------
http://www.itpub.net/index.php?referrerid=32
http://www.linuxforum.net/
http://www.oraclefan.net/
回复
发动态
发帖子
Sybase
创建于2007-09-28

2573

社区成员

Sybase相关技术讨论区
申请成为版主
社区公告
暂无公告