【DB】ストアドプロシージャとは?新卒エンジニアの学び

こんにちは、 エムティーアイ Advent Calendar 2024 の12月24日分の執筆を担当させていただくスマートコンテンツ事業部で開発を担当している、新卒の長澤です。

今回は、私が業務でソースコード調査をしている際に、始めて触れたデータベース技術の1つである「ストアドプロシージャ」について、その学びをアウトプットさせていただきます。

ストアドプロシージャについて勉強してみた結果、いくつかの利点や課題があることに気づきましたので、その内容を記載しております。


1. ストアドプロシージャとは?

ストアドプロシージャ とは、データベースに保存される一連のSQL文をまとめたプログラムのことです。通常、SQLクエリはその都度送信して実行されますが、ストアドプロシージャは事前にデータベース内に保存され、名前を指定して実行されます。

主な特徴

  • データベース内で保存・実行
    • クエリがデータベースサーバー内で直接実行されるため、クライアントとサーバー間の通信量を減らすことができます。
  • 再利用可能
    • 一度作成すれば何度でも呼び出せるため、同じ処理を繰り返し利用する場面に最適です。
  • 動的なパラメータ対応:
    • パラメータを渡すことで、柔軟な処理を実現することができます。

            ↓ SQL Server であれば SSMS からアクセス可能です

2. ストアドプロシージャの利点と課題

利点

  1. 処理が高速:

    ストアドプロシージャは、事前にコンパイルされているため、クエリの解析や最適化があらかじめ済んでいます。そのため、データベース内で効率的に処理を実行することができます。  また、1回の呼び出しで複数のクエリをまとめて実行できるので、アプリケーションとの通信量が減り、全体のパフォーマンス向上につながります。

  2. セキュリティの強化:

    SQLインジェクション対策として有効です。パラメータ化されたクエリを使用することで、入力データの安全性を確保します。

  3. 保守性の向上:

    アプリケーションコードとデータベース処理を分離し、ロジックをデータベース内に一元化できます。

課題

  1. デバッグの難しさ:

    実行時のエラー箇所の特定が難しく、一般的なプログラミング言語ほどデバッグが容易ではありません。実際にSSMSにアクセスして、クエリの内容を確認する必要があります。

  2. バージョン管理の課題:

    通常のアプリケーションのソースコードと異なり、ストアドプロシージャはデータベース内に保存されるため、Gitなどのバージョン管理ツールと連携がしづらいです。


3. ストアドプロシージャの基本構文と例

ストアドプロシージャを作成するためには、データベースの種類に応じた構文を理解する必要がありますが、以下は、SQL Serverを例にした基本構文とサンプルコードです。

基本構文(SQL Server)

CREATE PROCEDURE スキーマ名.プロシージャ名
    @パラメータ名 データ型 = デフォルト値
AS
BEGIN
    -- メイン処理
    SELECT * FROM テーブル名 WHERE カラム名 = @パラメータ名;
END;

例: 商品在庫を確認するプロシージャ

以下は、指定された商品IDの在庫数を取得するストアドプロシージャの例です。

CREATE PROCEDURE dbo.GetStock
    @ProductID INT
AS
BEGIN
    SELECT ProductName, StockQuantity
    FROM Products
    WHERE ProductID = @ProductID;
END;

実行方法

作成したプロシージャを呼び出すには、以下のように EXEC または CALL を使用します。

EXEC dbo.GetStock @ProductID = 123;

4. 実際の活用例

バッチ処理の自動化

例えば、月次で売上データを集計し、特定のテーブルに保存する処理を自動化できます。

CREATE PROCEDURE dbo.MonthlySalesSummary
AS
BEGIN
    INSERT INTO SalesSummary (Month, TotalSales)
    SELECT MONTH(SaleDate), SUM(Amount)
    FROM Sales
    GROUP BY MONTH(SaleDate);
END;

トランザクションの利用

複数のテーブルにまたがる処理を安全に実行できます。

CREATE PROCEDURE dbo.UpdateOrderStatus
    @OrderID INT, @Status NVARCHAR(50)
AS
BEGIN
    BEGIN TRANSACTION;

    UPDATE Orders
    SET Status = @Status
    WHERE OrderID = @OrderID;

    INSERT INTO OrderLogs (OrderID, Status, UpdatedAt)
    VALUES (@OrderID, @Status, GETDATE());

    COMMIT TRANSACTION;
END;

5. ストアドプロシージャの実行環境

今回の記事で使用した環境:

  • データベース: SQL Server 2019
  • ツール: SQL Server Management Studio (SSMS)

データベースの種類によって構文や挙動が異なる場合があるため、使用する環境に応じたドキュメントを参照してください。


6. まとめ

今回は、ストアドプロシージャをとは?というところから、実際の活用クエリまで、ご紹介いたしました。

ストアドプロシージャは、複数のテーブルを操作する、複雑なビジネスロジックを実行するときに、使えそうです。

一方で、保守性や管理の課題もあるため、必要な場面で適切に活用することが重要だと感じています。

今回の学習を通して、DBに対して、興味が出てきました。他にもトリガーやビューなどDBMSの便利機能はたくさんありそうなので、また機会があれば執筆させていただきます。

ここまでお読みいただきありがとうございました!