私は、ローカルの MySQL データベースを使用して、開発ボックス上でローカルに問題なく動作する Spring-mvc プロジェクト (DB アクセスに JPA と Hibernate を使用) を構築しています。
現在、クライアントが使用できるようにステージング サーバーにスナップショットを配置しようとしているのですが、問題が発生しています。
Tomcat は (多少の苦労の末) 私の war ファイルを問題なくデプロイし、ブラウザー経由でアプリケーションから何らかの応答を得ることができます。
Spring Security 認証の背後にあるメイン ページにアクセスすると、ログイン ページにリダイレクトされますが、これは完全に機能します。ユーザーの詳細をデータベースに照会するようにセキュリティを構成しており、これは正常に機能します。実際、データベース内のパスワードの変更はログイン フォームの動作に反映されるため、データベースにアクセスしてテーブルを照会していることは間違いありませんuser
。
認証されると、アプリの最初の「実際の」ページに移動し、「データ アクセス失敗」エラーが発生します。サーバーのコンソール ログには次の行が表示されます (編集済み):
ERROR org.hibernate.util.JDBCExceptionReporter - SELECT command denied to user
'myDbUser'@'localhost' for table 'asset'
ただし、まったく同じ認証情報を使用してシェルから MySQL にアクセスすると、asset
テーブルから選択する際にまったく問題はありません。
[development@tomcat01stg]$ mysql -u myDbUser -pmyDbPwd dbName
...
mysql> \s
--------------
mysql Ver 14.12 Distrib 5.0.77, for redhat-linux-gnu (i686) using readline 5.1
Connection id: 199
Current database: dbName
Current user: myDbUser@localhost
...
UNIX socket: /var/lib/mysql/mysql.sock
--------------
mysql> select count(*) from asset;
+----------+
| count(*) |
+----------+
| 19 |
+----------+
1 row in set (0.00 sec)
MySQL アクセス設定を分解し、ユーザーをクリーンアップして grant コマンドを再実行し、'localhost' からのユーザー バージョンと '%' からの別のユーザー バージョンを設定し、権限を確実にフラッシュしました...。この動作は何も変わりません。
何が起こったのですか?
答え1
理解した。
/src/main/resources/spring/database.properties に設定したデータベース構成はデータベース接続に使用されますが、Roo が「データベース リバース エンジニアリング」を実行するときに Roo に提供するスキーマは、Roo が作成したすべてのモデル クラスを通じて設定され、クエリでテーブル (schema.table) を指定するために使用されます。
ステージング サーバーのデータベース名は、ローカル ボックスのものと異なります。そのため、ローカル データベースのスキーマ名で入力された、使用していたテーブル名は間違っていました。その場合、MySQL は SELECT 権限がないという意味不明なエラー メッセージを表示しますが、実際に起こっているのはスキーマ名の不一致です。
最も手っ取り早い方法は、開発ボックスと同じ名前でステージング サーバーにデータベースを再作成することでした。これで問題は解決しました。