トリガー(trigger)は、データベースの中の「callback」みたいなもので、特定のイベントに反応するやつだよ。つまり、トリガーはINSERT、UPDATE、DELETEみたいな操作がテーブルで実行された時に自動で反応する仕組みなんだ。
例えば、君のところに賢いアシスタントがいて、何かするたびに自動で作業してくれると想像してみて。新しい学生のレコードを追加したら、アシスタントが自動で「最終更新日」のフィールドを更新してくれる感じ。データベースのトリガーもまさにそれと同じで、イベントを「聞いて」プログラムされたリアクションを実行するんだ。
トリガーは2つのものを組み合わせてる:
- イベント:テーブルで何かが起きる(例えばレコードの挿入)。
- トリガー関数:イベントが発生した時に実行されるコード。
トリガーは関数とセットじゃないと存在できないよ。関数がトリガー発動時に何をするか決めてるんだ。
トリガーの使い方例
じゃあ、どんな場面でトリガーが役立つのか、いくつか例を見てみよう。
- データの自動更新
学生のレコードを保存してるテーブルにlast_modifiedってフィールドがあって、レコードが変更されるたびに自動で更新したいとする。毎回手動でこのフィールドを更新する代わりに、トリガーを作れば自動でやってくれるよ。
- 変更のログ記録
誰がいつテーブルのデータを変更したか追跡したい時。トリガーを使えば、データが変更されるたびに監査(ログ)テーブルに自動で記録を追加できる。
- データのバリデーション
テーブルに追加されるデータが特定のルール(例えば学生の年齢は18歳以上)を満たしてるかチェックしたい時、トリガーで挿入前にデータを検証できる。
- 自動計算
ordersテーブルで注文を管理してて、注文が追加されるたびに顧客の合計購入金額を更新したい場合。これもトリガーで自動化できるよ。
トリガーを使うタイミング
トリガーの使い道が分かったところで、実際にどんな時に使うべきか話そう。
ログ記録・監査:トリガーは監査レコードを作るのに最適。重要なテーブルの変更を追跡できる。
データ整合性の維持:例えば、データベースからコースを削除した時、そのコースに紐づく学生も自動で削除して「ぶら下がりデータ」を防げる。
繰り返し作業の自動化:計算値の更新や集計データの更新など、よくある作業を自動化できる。
ビジネスロジックのDB実装:アプリのコードだけに頼らず、一部のロジックをデータベース側に持たせることもできる。
トリガーのメリット
もう分かったと思うけど、トリガーはかなり強力なツールだよ。こんな良いことがある:
自動化:人の手間が最小限。例えば、誰がデータを変更したかのトラッキングも自動でできる。
コードの重複削減:開発者が毎回アプリごとに更新やバリデーションのロジックを書く代わりに、DBに組み込める。
データ整合性の確保:トリガーはデータが常に正しい状態になるよう、追加のセーフティネットになる。
トリガーのデメリット
もちろん、どんなツールにも弱点はある。トリガーの「ダークサイド」も見てみよう:
デバッグが難しい:トリガーは「裏側」で動くから、思った通りに動かない時のデバッグが大変。
パフォーマンス問題の可能性:トリガーが複雑すぎたり、頻繁に呼ばれるとSQLクエリの実行が遅くなることも。
隠れたロジック:ビジネスロジックがトリガーの中に「埋もれて」しまうと、開発者がDBの中で何が起きてるか分かりにくくなる。
リアルな利用シナリオ
例1:変更のログ記録
例えばstudentsテーブルで学生データを管理してるとする。レコードの変更を追跡したい場合、トリガーでaudit_logテーブルに学生データが変更されるたびに記録を追加できる。
例2:自動更新
studentsテーブルにlast_modifiedカラムがあって、学生データが変更されるたびに自動で値を更新したい。これは更新後に発動するトリガーで実現できるよ。
GO TO FULL VERSION