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にしておきます。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
0
あり得ないと思っていることが起こっているということは、きっとちょっとしたミスが原因です。
もうそんなことあるかーい!とびっくり仰天してしまうぐらいに些細なミスがきっと原因です。穴があったら入りたいぐらいのミスが原因です。穴がないなら自分で掘って入るぐらいのミスが原因です!!!(違ったらごめんなさい)
私が経験した些細なミスの例を一つ挙げます。
あなたが今動かしていると思っているソースコード・プロパティファイルは本当に読み込まれて動いていますか?
動いていると思っていた jar の中のプロパティファイルとは別に、同名のプロパティファイルがクラスパス内に配置されていて、そっちが読み込まれていた…。
なんてことがあってびっくり仰天したなんてことがあります。
同じケースとは限りませんけど、何か解決の糸口になれば^^原因究明がんばってくださーい!
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
質問への追記・修正でSVC34さんが指摘されている通り、
プログラム自体に関する情報が少なく推測でしかありませんが・・・
SELECT文のテーブル名指定を スキーマ名.テーブル名 としてみてはどうでしょうか
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.09%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
SVC34
2017/05/14 11:58
少なくともjdbc接続プロパティファイルは問題ないように見えます。問題の発生しているシェルとJavaプログラム自体に関する情報があまりなくて状況がよくわからないので、ソースコード等を追記してみてください。
A.Ichi
2017/05/16 15:11
システム情報が取得できるでしょうか? SELECT has_table_privilege('public.tableA', 'select'); または、select current_database(), current_schema(), current_user, inet_server_addr(), inet_client_addr();