ストアドプロシージャー(Stored Procedure)とは、データベースに対する一連の処理を、名前を付けてデータベースの中に保存しておき、呼び出すだけで実行できるようにしたものです。複数のSQL文や条件による分岐などをひとまとめにできるため、業務システムで繰り返し行う処理によく使われています。
現実世界に例えると、ストアドプロシージャは倉庫の担当者に預けておく「月末の棚卸し手順書」のようなものです。毎回細かく指示を出さなくても、「月末の棚卸しをお願いします」と一言伝えるだけで、決まった手順をまとめて片付けてもらえます。
呼び出すだけで処理がまとまって動く
基本の使い方です。ストアドプロシージャは、あらかじめデータベースに登録しておき、アプリケーションからは名前と必要な値を渡して呼び出します。「注文を確定する」「月次の集計をする」といった、複数の手順からなる処理を1回の呼び出しで実行できるため、アプリケーション側の記述もすっきりします。
通信の回数を減らせる
性能面の利点です。アプリケーションからSQL文を1つずつ送ると、そのたびにデータベースとの通信が発生します。ストアドプロシージャにまとめれば、処理はデータベースの中で完結し、通信は呼び出しと結果の受け取りだけで済みます。大量のデータを扱う処理ほど、この差が大きくなります。
権限を絞って安全にできる
セキュリティ面の利点です。利用者には、表を直接読み書きする権限を与えず、決められたストアドプロシージャを実行する権限だけを与える、という使い方ができます。こうすると、許された手順以外ではデータを変更できなくなります。また、値を渡す仕組みを正しく使えば、SQLインジェクションのような攻撃も防ぎやすくなります。
値を受け渡して使い回す
柔軟に使うための仕組みです。ストアドプロシージャには、呼び出すときに値を渡す「入力」と、処理の結果を受け取る「出力」の引数を用意できます。たとえば顧客番号を渡して、その顧客の注文の合計を受け取る、といった使い方です。渡す値を変えるだけで同じ処理を何度も使い回せるため、同じようなSQL文をあちこちに書かずに済みます。
似た仕組みとの違い
データベースには、処理を保存しておく仕組みがほかにもあります。呼び出し方や動くきっかけによって、次のように使い分けられています。
| 仕組み | 動くきっかけ | 主な用途 |
|---|---|---|
| ストアドプロシージャ | アプリケーションから呼び出す | 一連の業務処理 |
| ストアドファンクション | SQL文の中で値を求めるときに使う | 計算や変換 |
| トリガー | データの追加や変更のときに自動で動く | 記録の自動作成など |
データベースごとに書き方が違う
注意したい点です。ストアドプロシージャの書き方は、データベースの製品ごとに異なります。OracleではPL/SQL、SQL ServerではTransact-SQLという独自の言語で書くのが一般的です。そのため、別のデータベースに乗り換えるときは、ストアドプロシージャを書き直す必要があり、乗り換えの手間が大きくなります。
管理の難しさ
運用での課題です。ストアドプロシージャはデータベースの中に保存されるため、アプリケーションのプログラムと比べて、変更の履歴の管理やテストがしにくい面があります。誰がいつ何を変えたのか分からなくなると、不具合の原因を追えません。定義をファイルにも残し、プログラムと同じように変更を管理する工夫が大切です。
どこまで任せるかの判断
設計の考え方です。業務のルールをデータベースの中に多く書きすぎると、処理があちこちに散らばり、全体の見通しが悪くなります。大量データの集計のように、データベースの中で行うほうが効率的な処理はストアドプロシージャに任せ、それ以外はアプリケーション側に書く、というように役割を分けるのが一般的です。
あわせて知っておきたい用語
- SQL:
データベースに問い合わせや操作を行うための言語です。 - トリガー:
データの変更などをきっかけに、自動で処理を実行する仕組みです。 - SQLインジェクション:
不正な文字列を入力して、データベースを不正に操作する攻撃です。 - Oracle Database:
企業の基幹システムで広く使われているデータベースです。


コメント