MySQLでストアドプロシージャを作成する際、DEFINER句は必須?指定方法と実行例を解説
結論:DEFINER句は省略可能です
いいえ、ストアドプロシージャを作成する際にDEFINER句は必須ではありません。DEFINERを明示的に指定したい場合にのみ記述します。省略した場合は、ストアドプロシージャを作成したユーザーが自動的にDEFINERとして設定されます。
なお、DEFINERを指定できるのはSUPER権限(MySQL 8.0以降ではSET_USER_ID権限またはSET_ANY_DEFINER権限)を持つユーザーのみである点にも注意が必要です。
mysql.userテーブルでユーザーとホストを確認する
まず、システム上に存在するユーザーとホストの一覧をmysql.userテーブルから確認してみましょう。
mysql> select user,host from mysql.user;
実行結果は以下のとおりです。
+------------------+-----------+ | user | host | +------------------+-----------+ | Manish | % | | User2 | % | | mysql.infoschema | % | | mysql.session | % | | mysql.sys | % | | root | % | | Adam Smith | localhost | | User1 | localhost | | am | localhost | +------------------+-----------+ 9 rows in set (0.03 sec)
DEFINERを指定してストアドプロシージャを作成する
ここでは、Adam Smith@localhostをDEFINERとして指定したストアドプロシージャを作成します。作成クエリは以下のとおりです。
mysql> delimiter //
mysql> CREATE DEFINER = 'Adam Smith'@'localhost' procedure Sp_Definer()
-> begin
-> select 'Hello MySQL';
-> end;
-> //
Query OK, 0 rows affected (0.14 sec)
mysql> delimiter ;この例では、一時的にデリミタを「//」に変更し、ストアドプロシージャの定義完了後に元の「;」へ戻しています。これは、ストアドプロシージャ内の複数のSQL文がクライアント側で個別の文として解釈されるのを防ぐための一般的な手法です。
ストアドプロシージャを実行する
作成したストアドプロシージャは、CALLコマンドで呼び出します。基本構文は以下のとおりです。
CALL ストアドプロシージャ名();
それでは、先ほど作成したSp_Definerを実際に呼び出してみましょう。
mysql> call Sp_Definer();
実行結果は以下のとおりです。
+-------------+ | Hello MySQL | +-------------+ | Hello MySQL | +-------------+ 1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
補足:DEFINERとINVOKERの違い
ストアドプロシージャには、セキュリティコンテキストを制御するための設定として以下の2種類があります。
- SQL SECURITY DEFINER(デフォルト):プロシージャはDEFINERとして指定されたユーザーの権限で実行されます。
- SQL SECURITY INVOKER:プロシージャを呼び出したユーザー自身の権限で実行されます。
DEFINERを指定しない場合は自動的に現在のユーザーが設定されるため、通常の用途であれば特に意識する必要はありません。ただし、共有環境や本番運用では、意図しない権限昇格を避けるためにどちらのモードで動作するかを把握しておくことが重要です。
-
MySQLストアドプロシージャで数学演算を実行する方法
MySQLのストアドプロシージャで計算処理を行うMySQLのストアドプロシージャを利用すると、金額×数量のような数学演算をまとめて定義し、必要なときに簡単に呼び出して実行できます。ここでは、引数として受け取った「amount(金額)」と「quantity(数量)」を掛け合わせて合計を求めるプロシージャを作成する手順を紹介します。ストアドプロシージャの作成まず、delimiter を変更してプロシージャ本体を定義します。以下の例では、amount と quantity の2つの INT 型引数を受け取り、その積を「Total」として表示します。mysql> delimiter // mys
-
MySQLストアドプロシージャでテーブルにデータを挿入する方法
MySQLのストアドプロシージャを使ってテーブルにデータを挿入するには、以下のような構文を使用します。create procedure yourProcedureName(OptionalParameter) begin insert into yourTableName() values(yourValue1,yourValue2,...N); endサンプルテーブルの作成まずは、この構文を実際に理解するために、テスト用のテーブルを作成してみましょう。mysql> create table DemoTable1928 ( Id int NOT NULL