質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

8559閲覧

別ユーザの外部テーブルを参照したい。

Tatsuya.S

総合スコア11

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

1クリップ

投稿2019/06/27 02:30

編集2019/06/27 06:07

前提・実現したいこと

ユーザAが作成したDBのDB_Aの外部テーブルをTable_AをユーザBで参照(select)したい。
外部テーブルはユーザAで「CREATE FOREIGN TABLE」を使い作成しています。
外部テーブルの参照先の外部DBは別マシンの別DBです

ユーザBのロールを作成して以下のSQLを発行し権限を付与
GRANT SELECT ON ALL TABLES IN SCHEMA public To 【ユーザB】;」
※【ユーザB】の箇所は実際のユーザ名

selectしたところ以下のエラーメッセージが発生しました。
select * from Table_A

発生している問題・エラーメッセージ

ERROR: "ユーザB" に対するユーザ対応表が見つかりません

試したこと

・\dでは以下のように表示されています。
public | Table_A | 外部テーブル | ユーザA
public | Table_B | テーブル | ユーザA

・\d Table_Aは結果を正しく取得できました。
・外部テーブルでないTable_B へのselectは可能でした。
・\zで確認したところ他のテーブルと同じアクセス権はついていました。
public | Table_A     | 外部テーブル | ユーザA=arwdDxt/DB_A+|
| | | ユーザB=r/DB_A |
public | Table_B    | テーブル | ユーザA=arwdDxt/DB_A+|
| | | ユーザB=r/DB_A
・select * from "ユーザA".Table_Aで検索したところ以下のエラーが発生
ERROR:リレーション""ユーザA".table_a"は存在しません

select * from "ユーザA".public.table_aで検索したところ以下のエラー
ERROR: データベース間の参照は実装されていません:

補足情報(FW/ツールのバージョンなど)

psql (PostgreSQL) 9.4.10

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2019/06/27 02:43

どのようなselect文を書いたのでしょうか。
Tatsuya.S

2019/06/27 05:24

以下のような条件のないselect分です。 select * from Table_A
m.ts10806

2019/06/27 05:31

下記のようにしたのかと思ってました。 select * from "ユーザA".Table_A ※試してみてダメだったら追記してください。たぶん色々と権限まわりが必要そうです。
Tatsuya.S

2019/06/27 05:44

試したことに追記しましたが「リレーション""ユーザA".table_a"は存在しません」が表示されてしましました。
m.ts10806

2019/06/27 05:46

ロール名が違うか、権限かなあと そういえばなぜかタイトルがかなり荒ぶってますので元に戻してもらえたらと
guest

回答1

0

ベストアンサー

権限のある ユーザでデータベースに接続して

sql

1grant select on all tables in schema スキーマ名 to ユーザ名;

です。(検証してみました)

外部テーブルに関して(詳細までは調べていませんが)

PostgreSQL 9.4.5文書 第 5章データ定義

あたりが参考になりそうですね。
「外部データへのアクセスは外部データソースからの認証を必要とする場合があります。この情報は、現在のPostgreSQLロールに基づいてユーザ名やパスワードといった追加のデータを提供することができるユーザマッピングによって提供することができます。」ってありますので、何か用意せねばならぬような・・・。

投稿2019/06/27 03:30

編集2019/06/27 06:21
showkit

総合スコア1638

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tatsuya.S

2019/06/27 05:31

質問を修正しましいた。 実際はスキーマ名、ユーザ名を入れて権限を付与しました。
showkit

2019/06/27 05:50

所有者のユーザで、psql で、データベースに接続して、「\d」でデータベースの一覧、「\t」で、テーブルの一覧が見れるかと思いますが。SELECT できるデータベースや テーブルの一覧と異なっているところはありませんか? それと、該当のテーブルの スキーマは 間違いなく「public」なんですよね?
Tatsuya.S

2019/06/27 06:11

ユーザAでも\dで確認しましがpublicで間違いはありません。 public | Table_A | 外部テーブル | ユーザA public | Table_B | テーブル | ユーザA
Tatsuya.S

2019/06/27 06:44

ユーザマッピング「CREATE USER MAPPING」でユーザBを追加することで認証エラーになったので一歩前進です。 ERROR: password is required DETAIL: Non-superuser cannot connect if the server does not request a password. HINT: Target server's authentication method must be changed. ユーザAで外部テーブル参照時には出ていないエラーなのでもう少し設定を見直してみます。
Tatsuya.S

2019/06/27 07:15

ユーザマッピングのSQL文に設定するユーザをユーザAで利用していたユーザに変更したところ無事接続できました。 ありがとうございました。
showkit

2019/06/27 07:49

あまり役に立たない回答でしたが、うまくいってよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問