こんにちは!データベースの世界へようこそ。
PostgreSQLを触り始めて、「テーブルにデータを入れたら、自動的に別のこともやってくれないかな?」なんて思ったことはありませんか?
例えば、「ユーザーが登録された瞬間に、自動で『ようこそメール』を送るフラグを立てたい」とか、「削除されたデータを別の『ゴミ箱テーブル』に退避させたい」といった要望です。
そんなとき、最強の味方になってくれるのが「トリガー関数」です。今日は、このちょっと魔法のような仕組みを、一緒に紐解いていきましょう。
—
トリガーって、何に例えられる?
エンジニアの世界では「トリガー=引き金」と呼びますが、イメージとしては「お店の自動ドア」や「コンビニのチャイム」を想像してみてください。
- お客さん(データ)が店に入ってきたら(INSERT)
- チャイムが鳴る(トリガー関数が動く)
あなたがわざわざ「いらっしゃいませ!」と叫ばなくても、センサーが動きを感知して自動的に処理をしてくれる。これがトリガーの正体です。
—
トリガー関数の「3つの魔法のキーワード」
トリガー関数の中では、PostgreSQLが気を利かせて、今の状況を教えてくれる特別な変数を用意してくれます。これがわかると、一気にプロっぽくなれますよ!
1. NEW と OLD(主役の登場!)
一番よく使うのがこの2つです。
- NEW: 今まさに「これから登録・更新されようとしている」新しいデータです。
- OLD: 「消される直前」や「書き換えられる前」の古いデータです。
「新しいデータが来たから、そのメールアドレスにメールを送ろう!」というときは `NEW.email` を使えばOK。簡単ですよね?
2. TG_OP(何が起きたの?)
これは「Operation(操作)」の略。今、INSERT(追加)されたのか、UPDATE(更新)されたのか、それともDELETE(削除)されたのかを教えてくれる変数です。
「追加のときはこの処理、削除のときはこっちの処理」と、一つの関数で使い分けたいときに大活躍します。
3. TG_TABLE_NAME(どこのテーブル?)
読んで字のごとく、今どのテーブルでイベントが起きたかを知る変数です。複数のテーブルで同じ関数を使い回すときに、「今、会員テーブルの話をしてるんだな」と判断するのに役立ちます。
—
実際に書いてみよう(イメージです)
難しく考えず、まずは「データが更新されたら、誰がいつやったかログを残す」という処理を頭の中で描いてみてください。
— こんな感じで「もし更新だったら、ログに記録する」と書くだけ!
IF (TG_OP = ‘UPDATE’) THEN
INSERT INTO audit_log (msg) VALUES (‘ID:’ || OLD.id || ‘が更新されました’);
END IF;
どうでしょう?「意外とシンプルだな」と思いませんか?
—
最後に:使いすぎには注意!
トリガー関数はとても便利で強力です。でも、あまりに複雑な処理を詰め込みすぎると、後からコードを見たときに「あれ、なんでここでデータが変わってるんだっけ?」と迷子になってしまうこともあります。
魔法の杖も使い方が大事。「本当に自動化すべき最小限の仕事」だけをトリガーに任せて、あとはアプリケーション側で管理する……そんなバランス感覚を持つと、あなたのデータベース設計はグッと洗練されますよ。
「難しそう」という壁は、こうやって一つずつ分解していけば必ず越えられます。まずは小さな関数を作って、DBが自動で動く感動をぜひ味わってみてくださいね!
また次回の記事でお会いしましょう。ハッピー・コーディング!
コメント