用触发器在删除某一条记录前把该记录insert到备份表

pipiright 2007-04-10 12:33:45
我的表叫contract,备份表叫contract_deleted.
我想实现在删除contract里的记录时先把此纪录insert到备份表contract_deleted和contract_billing_deleted,下面是我写的触发器,可是有问题,如果把insert into contract_deleted 去掉的话是没问题的,请问是怎么回事?

CREATE OR REPLACE TRIGGER CONTRACT_BEFORE_DELETE before delete
on CONTRACT for each row
begin
insert into contract_deleted
(select CONTRACT_NUM, CUSTNAME, COMPANY_NAME, LOCATION, PROJECT_NAME, START_DATE, END_DATE, TERMINATION_DATE, BILLING_METHOD, BILLING_SCHEDULE, AUTO_RENEW, TCV, ONE_TIME_CHARGE, MONTHLY_CHARGE, CONTRACT_RECEIVED_DATE, REMARKS, CONTRACT_STATUS from contract where contract_num = :old.contract_num);

insert into contract_billing_deleted
(select contract_num, billing_date, bill_ref_num, amount, remarks from contract_billing where contract_num = :old.contract_num);

end;
/
...全文
652 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
oracle_dba_11 2008-06-05
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 EdisonZhao 的回复:]
触发器不能使用本表,所以你的触发器不能通过编译。
[/Quote]
zxl_2609 2008-06-04
  • 打赏
  • 举报
回复
insert into contract_deleted (:old.对应的字段);
insert into contract_billing_deleted values
(:old.contract_num, :old.billing_date, :old.bill_ref_num, :old.amount, :old.remarks );
EdisonZhao 2008-01-25
  • 打赏
  • 举报
回复
触发器不能使用本表,所以你的触发器不能通过编译。
ys2004888 2008-01-25
  • 打赏
  • 举报
回复
这是行触发器,这样不行的
zhangxf1981 2008-01-25
  • 打赏
  • 举报
回复
不能这样写的 在触发器里面select 本表有问题的 你试试这个
CREATE OR REPLACE TRIGGER CONTRACT_BEFORE_DELETE before delete
on CONTRACT for each row
begin
insert into contract_deleted
(select CONTRACT_NUM, CUSTNAME, COMPANY_NAME, LOCATION, PROJECT_NAME, START_DATE, END_DATE, TERMINATION_DATE, BILLING_METHOD, BILLING_SCHEDULE, AUTO_RENEW, TCV, ONE_TIME_CHARGE, MONTHLY_CHARGE, CONTRACT_RECEIVED_DATE, REMARKS, CONTRACT_STATUS from contract where contract_num = :old.contract_num);

insert into contract_billing_deleted values
(:old.contract_num, :old.billing_date, :old.bill_ref_num, :old.amount, :old.remarks );

end;
mrdxhh 2008-01-25
  • 打赏
  • 举报
回复
语法结构好象有问题啊
hongtao945 2007-05-13
  • 打赏
  • 举报
回复
加commit;试试
CathySun118 2007-04-10
  • 打赏
  • 举报
回复
很可能是表结构不相同
难得糊涂糊涂 2007-04-10
  • 打赏
  • 举报
回复
before delete
修改为after delete 试试?
pipiright 2007-04-10
  • 打赏
  • 举报
回复
没人看到吗?
pipiright 2007-04-10
  • 打赏
  • 举报
回复
表contract_deleted和contract_billing_deleted是用表contract和contract_billing的同一个sql生成的,除了把主键去掉了,其他都一样
下面是出错提示.

ORA-04091: table TS.CONTRACT is mutating, trigger/function may not see it
ORA-06512: at "TS.CONTRACT_BEFORE_DELETE", line 2
ORA-04088: error during execution of trigger 'TS.CONTRACT_BEFORE_DELETE'

17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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