0

トリガーを作成して、変更 (更新または削除) を行うたびに、古いデータを新しいテーブルに (同じテンプレートで) コピーするようにしたいと考えています。

私はこのコードを試しました:

create table restrictions(ID int,name text);

insert into restrictions values(122,'suresh');

select * from restrictions;

create table restrictions_deleted(ID int,name text);// this is my duplicate table for keeping information of all updations.

CREATE OR REPLACE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
       INSERT INTO restrictions_deleted VALUES(OLD.ID, OLD.name);
       RETURN OLD;
    END;
$$ LANGUAGE plpgsql;


CREATE OR REPLACE TRIGGER moveDeleted
BEFORE DELETE ON restrictions 
FOR EACH ROW
EXECUTE PROCEDURE moveDeleted();

delete from restrictions where ID=122;
select * from restrictions_deleted;

このコードは、削除されたすべてのデータを複製テーブルに記録できます。しかし、更新についても同じことをしたいです。

何か提案、アイデアはありますか?

4

1 に答える 1

1

まず、トリガー関数RETURN NEW;の代わりにRETURN OLD;.

次に、トリガーを に変更しBEFORE DELETE OR UPDATEます。

最後 -AFTER DELETE OR UPDATEロギング トリガー用に設定することをお勧めします。このようにして、変更がロールバックされたときに無駄な作業を行うことはありません。

ところでhere、ロギング/監査トリガーの良い例です。

アップデート:

関数は次のようになります。

CREATE OR REPLACE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
    IF (TG_OP = 'UPDATE') THEN
        INSERT INTO restrictions_deleted VALUES(OLD.ID, OLD.name);
        RETURN NEW;
    ELSIF (TG_OP = 'DELETE') THEN
        INSERT INTO restrictions_deleted VALUES(OLD.ID, OLD.name);
        RETURN OLD;
    END IF;
    END;
$$ LANGUAGE plpgsql;
于 2013-03-12T09:58:43.367 に答える