トリガーを使用して(元のレコードを更新する前に)完全なレコードをレプリカテーブルに挿入したい。以下はサンプルテーブルです。
create table customer
(
cID number,
cName varchar2(30)
-- all other attributes will be defined here
);
create table replica
as (select * from customer where 1 = 2);
そしてトリガー:
create or replace trigger update_Trigger
before update on customer
for each row
begin
if updating then
insert into replica
select * from customer where cID = :old.cID;
-- also done with :new.cID; but not effect...
end if;
end;
テーブルが空ではありません。レコードがいくつかあります。しかし、更新ステートメントを実行すると お客様 テーブル、エラーが発生します:
SQL> UPDATE CUSTOMER
2 SET CNAME = 'C' WHERE CID = 102;
UPDATE CUSTOMER
*
ERROR at line 1:
ORA-04091: table DBADMIN.CUSTOMER is mutating, trigger/function may no
ORA-06512: at "DBADMIN.UPDATE_TRIGGER", line 3
ORA-04088: error during execution of trigger 'DBADMIN.UPDATE_TRIGGER'
これの何が問題になっていますか?何が欠けていますか?私はこれを使用して行うことができることを知っています :new.attribute そして :old.attribute しかし、元のテーブルには多くの属性があります。行全体を取得して挿入する短い方法はありますか?
この形式を使用して、元の値を次の場所にコピーできます。
CREATE OR REPLACE TRIGGER update_Trigger
BEFORE UPDATE ON customer
FOR EACH ROW
BEGIN
IF UPDATING THEN
INSERT INTO replica VALUES(:OLD.cID, :OLD.cName, ... );
END IF;
END;
/
replica
に挿入する各フィールドを指定する必要があります
一度に数千行を更新する場合、これは遅くなり、大量のネットワーク/データベーストラフィックを引き起こします。