ストアドプロシージャは、SQL 文や手続き的なロジックをデータベース内に保存し、名前で実行できるものです。ロジックをアプリケーションではなく DB 内で実行します。利点もありますが、トレードオフも大きいため、使う場面を選ぶ必要があります。
例
sql
CREATE PROCEDURE transfer_funds(from_id INT, to_id INT, amount DECIMAL)
LANGUAGE plpgsql AS $$
BEGIN
accounts balance balance amount id from_id;
accounts balance balance amount id to_id;
;
$$;
transfer_funds(, , );
使うとよい場面
text
✓ 複数アプリから共通で使う DB ロジック
✓ データに近い場所で実行した方が効率的なバッチ処理
✓ 権限を細かく制御したい処理
✓ DB 内で原子的に実行したい手順
注意点
text
✗ アプリケーションコードよりテストやレビューが難しい場合がある
✗ DB 製品ごとの方言に依存しやすい
✗ ビジネスロジックがアプリと DB に分散しやすい
✗ バージョン管理やデプロイ手順を整える必要がある
なぜ重要なのか
ストアドプロシージャは強力ですが、すべてのロジックを DB に置くべきという意味ではありません。性能、権限、共有ロジックの面で効果がある一方、保守性や移植性を下げる可能性があります。DB に置くべき処理とアプリケーション側に置くべき処理を判断できることが重要です。
