質問: Linux上でshを叩いたことでjavaクラスが動く仕様で、それによってpostgresqlに接続されてSELECT文が発行されるんですが、 『Relation "テーブル名" does not exist』 とEclipseコンソールログに出ます。 このような事象がなぜ起きるか再現したところ、エラー文言どおり1サーバー内にある他DBに接続してSELECT文発行により、『そのようなテーブルは存在しません。』と同様のエラーは吐きました。当たり前のことですが。 つまり、エラーの理由はshを叩いた際に違うDBへ接続してしまっているのではないかと疑っています。 現在postgresqlとjavaの連携として以下のようにして設定しています。 <pgAdminIII側のサーバ内設定「IP」:「ポート番号」> データベース名:postgres DBログインユーザー名:postgres DBログインパスワード:"" スキーマ名1:postgres テーブルのオーナー名:sakurasaku スキーマ名2:public テーブルのオーナー名:sakurasaku データベース名:sakurasaku DBログインユーザー名:postgres DBログインパスワード:"" スキーマ名1:postgres テーブルのオーナー名:sakurasaku スキーマ名2:public テーブルのオーナー名:sakurasaku←ここのテーブルをSELECT <java側のjdbc接続プロパティファイル> javaでjdbc接続をする際にプロパティ記載の方法として jdbc:postgresql://「IP」:「ポート番号」/「sakurasaku」 username:「sakurasaku」 password:「sakurasaku」 usernameの箇所にDBログイン名でなくてよいのか疑問なのですが、実際この設定でWEBサイトの会員ログインはできてしまいます。上のデータベースにはテーブルは空っぽですし、接続設定でDBをsakurasakuに指定しているので普段からsakurasakuデータベースに接続しているはずです。 WEBサイトにログインした際にはデータベースのsakurasakuを確かに見て会員登録していました。 いったいなぜshを叩いた際にテーブルが存在しないと出てしまうのか、そしてなぜこの設定でWEBサイトにログインできてしまうのか。 ローカル環境にて実行したところしっかりデータベース接続してSELECTできてしまっていまして、apachetomcatにてsh実行ではクラス実行され、ログはSELECT発行のメソッドまでいき、上記エラーが出るといった状態です。ファイルの権限については確認済みです。 何か気付く点やアドバイスなどあればよろしくお願いいたします。 追記:shはログ出力のファイルを作成したあとにそのディレクトリにクラスパスの設定をしてjavaバッチクラスを呼び出しています。 もしかしてsh実行時にOSのユーザー名でデータベース接続してしまうなどありうるのでしょうか。でもjdbc接続の際にユーザー名を指定しているので大丈夫だとは思うのですが...。 javaについてはjdbc.propertiesファイルを呼び出しDriverManager.getConnectionメソッドを利用しています。 追記2: jdbc:postgresql://「IP」:「ポート番号」/「sakurasaku」 username:「sakurasaku」 password:「sakurasaku」 このユーザー名はデータベースに入る際のユーザー名とパスワードだと思っているので本来であればpostgresユーザー名でログインするはずなのですが、なぜテーブル‐オーナー名であるsakurasakuでログインできてしまっているのでしょうか。これはただスーパーユーザではないsakurasakuがログインしてSELECTしているだけなので問題ないという認識で間違えないでしょうか。 また、 cron(rootユーザ)⇒sh(特に指定なし)⇒java(sakurasakuユーザ) こういったユーザ指定をしていますが、shの実行時に ~sh -U sakurasaku -P sakuarsaku というように最終的なテーブルオーナで実行していた方がよろしいでしょうか。その際のshの権限は777にしておきます。
回答: あり得ないと思っていることが起こっているということは、きっとちょっとしたミスが原因です。 もうそんなことあるかーい!とびっくり仰天してしまうぐらいに些細なミスがきっと原因です。穴があったら入りたいぐらいのミスが原因です。穴がないなら自分で掘って入るぐらいのミスが原因です!!!(違ったらごめんなさい) 私が経験した些細なミスの例を一つ挙げます。 あなたが今動かしていると思っているソースコード・プロパティファイルは本当に読み込まれて動いていますか? 動いていると思っていた jar の中のプロパティファイルとは別に、同名のプロパティファイルがクラスパス内に配置されていて、そっちが読み込まれていた...。 なんてことがあってびっくり仰天したなんてことがあります。 同じケースとは限りませんけど、何か解決の糸口になれば^^原因究明がんばってくださーい!