我的表叫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, res from contract_billing where contract_num = :old.contract_num);end;
/
我想实现在删除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, res from contract_billing where contract_num = :old.contract_num);end;
/
下面是出错提示.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'
修改为after delete 试试?
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.res ); end;
insert into contract_billing_deleted values
(:old.contract_num, :old.billing_date, :old.bill_ref_num, :old.amount, :old.res );