web-dev-qa-db-ja.com

トリガー:削除された行をアーカイブテーブルに移動

私のPostgreSQLデータベースには、restrictionsという小さな(約10行)テーブルがあり、値は毎日削除され、挿入されます。

restrictions_deletedと呼ばれるテーブルが必要です。restrictionsから削除されるすべての行は自動的に保存されます。 restrictionsにはシリアルIDがあるため、重複はありません。

PostgreSQLでこのようなトリガーを作成するにはどうすればよいですか?

18
Adam Matan

削除する前に、古いデータをrestrictions_deletedテーブルに移動するだけです。これは OLD データ型で行われます。 regulat INSERTステートメントを使用し、OLD値を挿入される値として使用できます。

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


CREATE FUNCTION moveDeleted() RETURNS trigger AS $$
    BEGIN
       INSERT INTO restrictions_deleted VALUES(OLD.column1, OLD.column2,...);
       RETURN OLD;
    END;
$$ LANGUAGE plpgsql;
16
DrColossos

別のアプローチを受け入れる場合は、テーブルに「削除済み」ブールフラグまたは「deleted_at」タイムスタンプを追加することを検討しましたか?.

または、データベーステーブルへのCRUDアクセスを拒否し、トランザクションAPIで監査証跡を処理します。