Linux上でshを叩いたことでjavaクラスが動く仕様で、それによってpostgresqlに接続されてSELECT文が発行されるんですが、
『Relation "テーブル名" does not exist』
とEclipseコンソールログに出ます。
このような事象がなぜ起きるか再現したところ、エラー文言どおり1サーバー内にある他DBに接続してSELECT文発行により、『そのようなテーブルは存在しません。』と同様のエラーは吐きました。当たり前のことですが。
つまり、エラーの理由はshを叩いた際に違うDBへ接続してしまっているのではないかと疑っています。
現在postgresqlとjavaの連携として以下のようにして設定しています。
<pgAdminⅢ側のサーバ内設定「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にしておきます。
回答2件
あなたの回答
tips
プレビュー