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


18

restrictionsPostgreSQLデータベースで呼び出される小さな(〜10行)テーブルがあり、値が毎日削除および挿入されます。

restrictions_deletedから削除されるすべての行がrestrictions自動的に保存されるというテーブルが必要です。以来、restrictionsシリアルIDを有し、全く重複が存在しないであろう。

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

回答:


15

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;

2
列の値の明示的なリストを次のようなものに置き換えることができますVALUES((OLD).*)
KayEss

1
正常に動作しますが、create function前に呼び出す必要がありますcreate trigger。そして、VALUES((OLD).*)KayEssによって提案されたトリックは素晴らしいです。
mivk

8

別のアプローチを受け入れている場合は、「削除済み」ブール値フラグをテーブルに追加するか、代わりに「deleted_at」タイムスタンプを追加することを検討してください。

それとも、データベーステーブルへのCRUDアクセスを拒否し、トランザクションAPIで監査証跡を処理します:)


+1ありがとう-私の場合はうまくいきませんが、単一のテーブルのみを使用する素晴らしいアプローチです。
アダムMatan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.