2011-09-13 7 views
9

私はRedHatでPostgreSQL 9.0.3を使用しています。データベースには、publicwhの2つのスキーマが含まれています。 djangoという新しい役割を作成しました。私はこのユーザーにwhスキーマをデフォルトとして使用させたいと思います。PostgreSQLの検索パスの変更が広告として反映されない

マニュアルに続いて、私はなかった:私は、その後\dtを行う場合は、publicスキーマからのテーブルのみが表示され

SHOW SEARCH_PATH; 
search_path 
------------- 
wh, public 

ALTER USER django SET SEARCH_PATH TO wh, public; 

をこれが動作するように表示されます。このマニュアルでは、検索パスを変更するとすぐに影響が出るはずです。接頭辞なしでwhテーブルにアクセスできるはずですが、そうではありません。ログインとログアウトは、変更をsearch_pathに保持しますが、動作の変更は表示されません。

私には何が欠けていますか?

答えて

11

これはあなたの問題を解決する可能性があります (またはGRANT ALL ...もしあなたが望むならば)

search_pathを設定すると、PostgreSQLはlooに命令しますkは、リストされたスキーマのオブジェクトです。そこにあるものを見るための許可は与えない。 "django"に必要な権限がない場合、\dtはその情報を表示してはいけません。

一方、(以前の提案に対するあなたのコメントによると)スーパーユーザーとして既に試してみたら、これはそうではないかもしれません...

+0

こんにちはアーウィン、これは働いた!スーパーユーザーにこの役割を与えることでこれを達成できなかったことは、私にとって非常に奇妙です。ただし、スキーマの明示的な許可によって、動作が正しく行われます。貢献したすべての人に感謝します。 – talonsensei

+1

「SELECT id FROM mytable」のようなスキーマ修飾なしのテーブルをクエリすると、PGは 'relation" mytableが "存在しません"と言うでしょうが、これは存在していることを誤解していますが、アクセス。したがって、 'SELECT id FROM myschema.mytable;のような適切なスキーマ名でテーブルをクエリすると、代わりに、'スキーマに対する許可が拒否されました.'というメッセージが表示されます。 'GRANT USAGE SCHEMA .. 'ステートメントが必要です。これは、問合せで完全修飾スキーマ名を使用することが良いアイデアである理由の1つです。 –

+0

こんにちはアーウィン、ソリューションをありがとう、私を救った! :-)とtalonsenseiのおかげで、ここで質問を始めました:-) – shahjapan

0

これは\dtコマンドの制限事項です。

search_pathが正常に動作していることを確認するには、SELECT * FROM some_tableを実行してください。ここで、some_tableはwhスキーマにあります。

+0

提案していただきありがとうございます。私はそれを試みたが、テーブルが存在しないと言うエラーが出る。クエリにwhの接頭辞を付けると、それは機能します。だから\ dtの制限ではないと思われます – talonsensei

0

Windows 64ビット版で9.1をテストしたところで(ちょうどリリース)、仕様どおりに動作しました。 ALTER ROLE manページから

抜粋:

残りの変種がIN DATABASE句のみでのセッションのために、指定された場合、どちらかのすべてのデータベースについて、 設定変数の役割のセッションのデフォルト値を変更したり、名前付きデータベース。 その後、ロールが新しいセッションを開始すると、指定された の値が、セッションのデフォルトになり、postgresql.confにある の設定を上書きするか、postgres コマンドラインから受信されます。 これはログイン時にのみ発生します; SET ROLE またはSET SESSION AUTHORIZATIONを実行しても、新しい設定値 は設定されません。

GRANT USAGE ON SCHEMA wh TO django; 

(。または、(直接または間接的な)メンバーとしてのDjangoを持っている任意の役割にはGRANT USAGE)

強調鉱山

+0

Milenありがとうございます。私はそれをしました。プライマリadmin/superuserロールではこれが機能し、\ dtはwhスキーマのテーブルのみを表示します。しかし、私が理解していない理由のために、私が他のユーザーのためにこれを行うと、たとえ管理者/スーパーユーザーにしても、\ dtはパスが変更されてもwhではなく公開テーブルを表示します。 – talonsensei

+0

これを確実に再現でき、小さなテストケースを考案できたら、開発者はあなたからの声を聞きたいと思います。しかし、まず、使用しているメジャーバージョン(9.0)の最新のマイナーバージョン(9.0.4)でこれをテスト/再現していることを確認する必要があります。 –

+0

Milenありがとうございます。それは再現可能だと私は信じている。私は9.0.1(Snow Leopard)と9.0.3(Redhat)の両方のインストールをテストしました。 – talonsensei

0

PostgreSQLの場合、ユーザがデータベースに接続してテーブルのようなオブジェクトを探すと、最初に という名前のスキーマが見つかると、同じ名前のユーザ名が見つからない場合は パブリックスキーマを探し、あなたの場合、djangoユーザーを介してデータベースに接続すると、デフォルトでスキーマdjangoが検索されますが、現在のスキーマをwhにしたいので、スキーマ名とロール名を同じにしてください。役割はプレフィックスを入力せずにあなたの問題を鼓舞する、ちょうど試してみてください!

+0

こんにちはフランク、あなたの提案は完璧な意味を持っています。私はそれを試しましたが、ユーザーwhのデフォルトの検索スペースはまだ "$ user"、publicと\ dtですパブリックテーブルのみが表示されます。 current_schemas(true)の出力は{pg_catalog、public}です。だから、それは動作するようには見えません。 – talonsensei

+0

今、あなたのユーザー名とスキーマ名は何ですか?データベースがprod dbでない場合は、両方を同じ名前にすることができます。また、テーブルの所有者名も確認します。 – francs

関連する問題