LoginSignup
1
5

More than 3 years have passed since last update.

DELETEしたレコードを履歴テーブルにINSERTするトリガーを実装する

Posted at

前提

【RDBMS】
PostgreSQL 12.2

【準備するテーブル】
・削除対象のテーブル(productテーブル)
・削除したレコードを移すテーブル(archiveテーブル)

手順① トリガプロシージャの作成

プロシージャとは連続した複数の処理を1つに定義したものです。
プロシージャでは条件分岐やループなどを記述することもできますが、今回はINSERTするだけの機能であるため、シンプルに記述します。

トリガプロシージャの決まりとしてPostgreSQL 11.5文書には以下のように記述されています。

トリガ関数は、引数を取らない、trigger型を返す関数として宣言される必要があります
https://www.postgresql.jp/document/11/html/trigger-definition.html

以上を踏まえてトリガプロシージャを作成します。

CREATE FUNCTION process_backup()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
BEGIN 
    INSERT INTO archive SELECT OLD.*;
    RETURN OLD;
END
$function$
OLDについて

OLDは更新される前のデータベースの行を保持しています。今回実装しようとしているトリガプロシージャでは、削除される行がOLDに格納されることになります。

RETURN OLDについて

DELETEの場合は、渡された行(OLD)を返す必要があります。元テーブルのデータをまったく変更しない場合はNULLを返します。

②トリガーの宣言

productテーブルの行削除後に①で定義したprocess_backup()が実行されるように定義します。

CREATE TRIGGER backup_recode 
AFTER DELETE ON product 
 FOR EACH ROW EXECUTE PROCEDURE process_backup();

実行結果

  • DELETE前
product.id product.name archive.id archive.name
1 apple
2 orange
  • DELETE後
DELETE FROM product;
product.id product.name archive.id archive.name
1 apple
2 orange

DELETEしたタイミングでarchiveテーブルに削除内容がINSERTされています。

まとめ

トリガプロシージャの作成とトリガを定義することで、削除したレコードを別テーブルに移すことができました。トリガプロシージャに条件分岐やループを用いることでさらに高度なレコード操作ができそうですね。

ブログも是非 => 文系SEの気ままにTech LIFE

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5