请问怎样写这样一个触发器?(在线等待)

goodfood 2003-05-26 11:16:07
有表A, B,

当A的某字段field1从0变成1时, 向B中插入一些信息,

已经有一个存储过程完成向B插入 fill_B,

但是, 问题在于:

1) 如何在定义trigger的时候, 限制只有A.field1是从0变到1时才触发?

2) trigger执行时出错, cannot COMMIT in a trigger, 那fill_B怎样提交呢?

请教, 多谢
...全文
32 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
BlueskyWide 2003-05-26
  • 打赏
  • 举报
回复
create or replace trigger a_b
after update on your_user.a for each row
when (old.field1=0 and new.field1=1)
begin
exec fill_b;
commit;
end a_b;



goodfood 2003-05-26
  • 打赏
  • 举报
回复
多谢bobfang(匆匆过客)

不过如果fill_B中不使用commit的话, fill_B中执行的动作如update, insert要如何提交呢?

还有就是现在执行报错:

table bill.table_A is mutating, trigger/function may not see it

这个要如何解决?
yangjuanli 2003-05-26
  • 打赏
  • 举报
回复
bobfang(匆匆过客) 的回答完全正确。:)
bobfang 2003-05-26
  • 打赏
  • 举报
回复
利用:NEW.field1和:OLD.field1来判断是否由0变为1。
fill_B中不要commit。
goodfood 2003-05-26
  • 打赏
  • 举报
回复
搞定, 结帐
goodfood 2003-05-26
  • 打赏
  • 举报
回复
那么如果说我希望在对table_A的field1改变时(update),

根据table_A的field2(也就是做select得到field2的数值)向table_B插入数据

一般的写法是怎样的?
w_tsinghua 2003-05-26
  • 打赏
  • 举报
回复
trigger中不能commit,并且不应该支持,否则,保证不了事物的完整性,
trigger中的语句与你调用触发此trigger的语句是属于同一个事物
goodfood 2003-05-26
  • 打赏
  • 举报
回复
那么如果说我希望在对table_A的field1改变时, 根据table_A的field2向table_B插入数据
一般该怎么做?

trigger中不能commit, 那trigger的事务提交怎么办呢?

我现在的做法是:

create or replace trigger tri_tableA_status
...
begin
proce1;
end;

create or replace procedure proce1
is
...
b_field integer;
begin
...
select field2 into b_field from table_B;
...
end;
Lastdrop 2003-05-26
  • 打赏
  • 举报
回复
1. trigger中不能commit
2. 你在bill.table_A的trigger中对bill.table_A进行了操作(包括查询),除了before insert触发器外,是不可行的。
goodfood 2003-05-26
  • 打赏
  • 举报
回复
trigger中能commit么?

table bill.table_A is mutating, trigger/function may not see it
是怎么回事, 要怎么解决?

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧