免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 6352 | 回复: 23
打印 上一主题 下一主题

能否在表的触发器中当一记录变化修改另一记录 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-06-09 15:58 |只看该作者 |倒序浏览
各位同仁高手请指教:表A有A_id,u_orig_value,parent_id等字段,parent_id指向表A的另一记录的A_id,
能否用表A的trigger实现---当A的某一条记录的字段u_orig_value发生变化时,相应修改其parent_id指向的记录的u_orig_value ??
我用过trigger,但资源锁定冲突啊!
小弟从网络搜索无所收获,从自己有的几本书也未能找到帮助,同事朋友给的建议就是尽量改用存储过程,存储过程需要调用者啊,而对用户来说多个按钮不知道做啥用的确不能少点不能多点,用户感到不理解。请求高手指教如何解决?不胜感谢!!!!

论坛徽章:
0
2 [报告]
发表于 2004-06-09 18:05 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

是不是没有人能解决阿?

论坛徽章:
0
3 [报告]
发表于 2004-06-09 21:54 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

这样用trigger应该可以的,检查一下你的tigger是不是合理化的修改其相关记录

论坛徽章:
0
4 [报告]
发表于 2004-06-10 08:44 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

能否将你初步写的trigger贴上来,大家帮你看看

论坛徽章:
0
5 [报告]
发表于 2004-06-10 09:29 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

可能是我反应太迟钝了,看不懂你想实现什么样的操作和你表中各字段的关系。

论坛徽章:
0
6 [报告]
发表于 2004-06-10 11:05 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

谢谢各位大侠相助!!!感谢感谢先:)
是这样的:tablename-U_EQUIPMENT_Essence,包括如下字段:equipment_original_value、u_equipment_essence_id、u_main_equipment_essence_id。建的trigger如下:create or replace trigger U_EQUIPMENT_Essence_TRG
  before  update on U_EQUIPMENT_Essence
  for each row

begin
update u_equipment_essence set equipment_original_value =equipment_original_value + :new.equipment_original_value where u_equipment_essence_id = :new.u_main_equipment_essence_id
and u_assembtype ='M';
end ;
报错如下:ORA-04091: 表 CQSBGL.U_EQUIPMENT_ESSENCE 发生了变化,触发器/函数不能读
ORA-06512: 在"CQSBGL.U_EQUIPMENT_ESSENCE_AFTER_TRG
请大家相助

论坛徽章:
0
7 [报告]
发表于 2004-06-10 11:18 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

接上再说明一下,u_equipment_essence_id 为表u_equipment_essence的主键,u_main_equipment_essence_id用作关联的,u_assembtype  表示设备类别的,u_assembtype='M'表示主机 u_assembtype='P'表示部件,部件的u_main_equipment_essence_id字段存的就是主机的u_equipment_essence_id的值,当部件的equipment_original_value 增加或减少时,主机的也要相应增加或减少
在触发器中的本意是当部件的equipment_original_value 变化就修改其主机的equipment_original_value 。当前只锁定部件的记录行啊,为何修改主机会报 触发器/函数不能读 呢?

论坛徽章:
0
8 [报告]
发表于 2004-06-10 11:32 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

我也试过用表层触发器,但表层是不能用:new或ld的阿,就是说我没办法找到当前修改的行,那么我只好写成如下:
Create Or Replace Trigger U_Equipment_Essence_After_Trg
  after  update
  on u_equipment_essence
   
declare
cursor main_equipment is
select u_equipment_essence_id from u_equipment_essence
where u_assembtype ='M';
begin
for p1 in main_equipment loop
update u_equipment_essence es set
es.equipment_original_value = (select sum(equipment_original_value) from u_equipment_essence where u_main_equipment_essence_id =es.u_equipment_essence_id and u_assembtype='P'),
es.month_depreciation_value = (select sum(month_depreciation_value) from u_equipment_essence where u_main_equipment_essence_id =es.u_equipment_essence_id and u_assembtype='P'),
es.year_depreciation_value = (select sum(year_depreciation_value) from u_equipment_essence where u_main_equipment_essence_id =es.u_equipment_essence_id and u_assembtype='P'),
es.u_ljzj = (select sum(u_ljzj) from u_equipment_essence where u_main_equipment_essence_id =es.u_equipment_essence_id and u_assembtype='P')
where es.u_equipment_essence_id =p1.u_equipment_essence_id;
end loop;

end U_Equipment_Essence_After_Trg;
这样,运行时报错如下:ORA-00036: 超过递归 SQL (50) 级的最大值
ORA-06512: 在"CQSBGL.U_EQUIPMENT_ESSENCE_AFTER_TRG"

论坛徽章:
0
9 [报告]
发表于 2004-06-10 11:41 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

试试

.........
before update on U_EQUIPMENT_Essence
for each row


DECLARE
   PRAGMA AUTONOMOUS_TRANSACTION;


begin
update u_equipment
..........

应该没有问题了

论坛徽章:
0
10 [报告]
发表于 2004-06-10 11:42 |只看该作者

能否在表的触发器中当一记录变化修改另一记录

如下的也报错:ORA-04091: 表 CQSBGL.U_EQUIPMENT_ESSENCE 发生了变化,触发器/函数不能读

create or replace trigger U_EQUIPMENT_Essence_TRG
before update
of equipment_original_value
on U_EQUIPMENT_Essence

for each row
when (new.u_assembtype ='P')
begin
update u_equipment_essence set
equipment_original_value =equipment_original_value + :new.equipment_original_value
where u_equipment_essence_id = :new.u_main_equipment_essence_id
and u_assembtype ='M';

end U_EQUIPMENT_Essence_TRG;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP