MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLストアドプロシージャでDEFINER=`root`@`%`がローカルホストで動作しない原因と対処法

MySQLのストアドプロシージャにおいて、DEFINERに`root`@`%`を指定した際にローカルホスト上で正しく動作しないトラブルは少なくありません。多くの場合、原因はユーザーアカウントのホスト設定にあります。この記事では、問題の切り分け方と具体的な解決手順を解説します。

1. ユーザーアカウントのホスト設定を確認する

まず最初に確認すべきはホストの設定です。MySQLにおけるホストには「localhost」または「%(ワイルドカード)」が指定されます。現在存在しているユーザーアカウントとそのホストは、以下のクエリで一覧表示できます。

mysql> select user,host from mysql.user;

実行すると、次のような出力が得られます。

+------------------+-----------+
| user             | host      |
+------------------+-----------+
| Bob              | %         |
| User2            | %         |
| mysql.infoschema | %         |
| mysql.session    | %         |
| mysql.sys        | %         |
| root             | %         |
| @UserName@       | localhost |
| Adam Smith       | localhost |
| David            | localhost |
| James            | localhost |
| John             | localhost |
| John Doe         | localhost |
| User1            | localhost |
| am               | localhost |
| hbstudent        | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
+------------------+-----------+
17 rows in set (0.00 sec)

DEFINERを機能させるには、指定したユーザー名とホストの組み合わせがこのテーブルに実際に存在している必要があります。「Bob」というユーザーがホスト「%」で登録されている点に注目してください。

2. DEFINERを指定してストアドプロシージャを作成する

ここでは、ユーザー「Bob」、ホスト「%」をDEFINERとして持つストアドプロシージャを作成します。以下がそのクエリです。

mysql> DELIMITER //
mysql> CREATE DEFINER=`Bob`@`%` PROCEDURE `Message`()
    BEGIN
      select "Hello World";
    END
    //
Query OK, 0 rows affected (0.14 sec)
mysql> DELIMITER ;

3. ストアドプロシージャを実行する

作成したストアドプロシージャは、CALLコマンドを使って呼び出します。

mysql> call `Message`();

正常に動作すれば、次のような結果が出力されます。

+-------------+
| Hello World |
+-------------+
| Hello World |
+-------------+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.01 sec)

まとめ

DEFINERに関するエラーが発生した場合は、まずmysql.userテーブルで対象ユーザーのhost列の値(「localhost」か「%」か)を確認することが重要です。DEFINERに指定するユーザーとホストの組み合わせが実在しなければ、プロシージャは正しく動作しません。環境に合わせて適切なホストを指定することで、問題を回避できます。

  1. MySQLストアドプロシージャで数学演算を実行する方法

    MySQLのストアドプロシージャで計算処理を行うMySQLのストアドプロシージャを利用すると、金額×数量のような数学演算をまとめて定義し、必要なときに簡単に呼び出して実行できます。ここでは、引数として受け取った「amount(金額)」と「quantity(数量)」を掛け合わせて合計を求めるプロシージャを作成する手順を紹介します。ストアドプロシージャの作成まず、delimiter を変更してプロシージャ本体を定義します。以下の例では、amount と quantity の2つの INT 型引数を受け取り、その積を「Total」として表示します。mysql> delimiter // mys

  2. MySQLストアドプロシージャでテーブルにデータを挿入する方法

    MySQLのストアドプロシージャを使ってテーブルにデータを挿入するには、以下のような構文を使用します。create procedure yourProcedureName(OptionalParameter) begin insert into yourTableName() values(yourValue1,yourValue2,...N); endサンプルテーブルの作成まずは、この構文を実際に理解するために、テスト用のテーブルを作成してみましょう。mysql> create table DemoTable1928 ( Id int NOT NULL