web-dev-qa-db-ja.com

トリガーを使用して更新する前に単一のレコードをレプリカテーブルにコピーする(Oracle 12c)

トリガーを使用して(元のレコードを更新する前に)完全なレコードをレプリカテーブルに挿入したい。以下はサンプルテーブルです。

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 しかし、元のテーブルには多くの属性があります。行全体を取得して挿入する短い方法はありますか?

2
Someone

この形式を使用して、元の値を次の場所にコピーできます。

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に挿入する各フィールドを指定する必要があります

一度に数千行を更新する場合、これは遅くなり、大量のネットワーク/データベーストラフィックを引き起こします。

1
JayJay