MySQLデータベースにストアドプロシージャ'myProc'を作成しました。それから私はこの手順をやめました。以前と同じ名前のプロシージャをもう一度作成したいと思います。プロシージャを再度作成し、「myProc」という名前を付けます。
CALL myProc();
しかし、この手順を実行すると、そのようなエラーになります"PROCEDURE myProc does not exit"
。また、コードは前のものと同じです。
MySQLデータベースにストアドプロシージャ'myProc'を作成しました。それから私はこの手順をやめました。以前と同じ名前のプロシージャをもう一度作成したいと思います。プロシージャを再度作成し、「myProc」という名前を付けます。
CALL myProc();
しかし、この手順を実行すると、そのようなエラーになります"PROCEDURE myProc does not exit"
。また、コードは前のものと同じです。
MySQL でストアド プロシージャを呼び出せません
MySQL 5 でプロシージャを作成しました。アプリケーションのユーザー アカウントに EXECUTE 権限を付与しました。ただし、アプリケーションがそのプロシージャを呼び出すステートメントを準備すると、例外がスローされます。おそらく、ConnectorJ の奥深くにある NullPointerException です。おそらく例外は、プロシージャが存在しないことを主張しています。または、幸運にも、正しいパスに導く例外を取得できた可能性があります (ドライバーは、引数宣言に続く ''\nbegin'' または ''\n'' のいずれかを含むプロシージャーの宣言、または SELECT 権限を必要としますmysql.proc で列の型を解析します)。以下は、MySQL フォーラムを何時間も検索して得たトラブルシューティングの手順です。
まず、2 つのコンソール ウィンドウを開きます。1 つは、アプリケーション ユーザーとして MySQL にログインします。もう一方では、root としてログインします。アプリ ウィンドウで、データベースを一覧表示します。
SHOW DATABASES;
アプリケーションのデータベースが表示されない場合は、ルート ウィンドウに移動して、データベース権限を付与する必要があります。
USE mydatabase;
GRANT ALL ON mydatabase TO appuser;
アプリウィンドウに戻ります。データベースを再度リストして、表示されることを確認します。それができたら、それに入ります。
USE mydatabase;
入ったら、手順を表示してみてください。
SHOW CREATE PROCEDURE myproc /G
3つのうちの1つが起こります。「PROCEDURE myproc does not exist」というメッセージが表示された場合、アプリ ユーザーにはその権限がありません。ルート ウィンドウに戻り、権限を付与します。
GRANT EXECUTE ON PROCEDURE myproc TO appuser;
2 番目に発生する可能性があるのは、プロシージャーは検出されますが、ボディはリストされないということです。代わりに、「Create Procedure: NULL」と表示されます。その場合は、ルート ウィンドウに戻って対処してください。
GRANT SELECT ON mysql.proc TO appuser;
起こりうる 3 番目のことは、あなたが望んでいることです。プロシージャの本体がリストされます。これで、アプリケーションからプロシージャを呼び出すことができるはずです。
警告
このような問題を解決するために、いくつかの近道をしたくなるかもしれません。しないでください。ショートカットは、将来的に大きな問題を引き起こす可能性があります。
最初に試みることは、アプリケーション内から root アカウントを使用することです。これは非常に危険です。セキュリティは何層にもなります。ストアド プロシージャとプリペアド ステートメントを使用して SQL インジェクション攻撃を回避する必要がありますが、いずれにせよ攻撃が発生した場合に備えて、最小特権の原則も適用する必要があります。アプリケーションがルートとして接続できるようにすると、攻撃者は最も貴重なリソースであるデータにアクセスできるようになります。しかし、アプリケーションの各部分に必要な特権のみを持つ個別のアカウントを与えると、悪者を隔離することになります。
何時間もの調査の後に試すことができる 2 番目のことは、ConnectorJ 接続文字列に「noAccessToProcedureBodies」フラグを設定することです。このフラグは、JDBC ドライバーが提供するパラメーターの型チェックを回避するため、避けてください。このフラグにより、ConnectorJ はすべてのパラメータを文字列に変換し、MySQL はそれを必要な型に変換します。
しかし、問題を段階的に見ていくことで、これらの近道は必要ないはずです。
参照