前提
【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