postgresqlのすべてのテーブルにGRANT SELECT


回答:


145

9.0の時点で、postgresにはスキーマ内のすべてのテーブル(および他のオブジェクト)に対する特権を付与する構文があることに言及するのが役立つと思いました。

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;

こちらがリンクです。


私はすぐにアップグレードするので、これは本当に良いニュースです。ありがとう!
アダムMatan

これは、パブリックスキーマを使用するサーバー上のすべてのデータベースに影響しますか?
クリスチャンプ

5
新しいテーブルを作成する場合、このユーザーは新しく作成されたテーブルにアクセスできますか?
GuiSim

8
@GuiSimいいえ、default privilegesytouがテーブルを作成するスキーマにを設定する必要があります:postgresql.org/docs/current/static/…–
SkyRaT

@kristianpいいえ、PGクラスター内のすべてのデータベースには独自のパブリックスキーマがあります。public接続している現在のDB のスキーマ内のすべてのテーブル(関数)に影響します。
SkyRaT

11

私の(非ライナー)ソリューション:

#!/bin/bash

for table in `echo "SELECT schemaname || '.' || relname FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done

特権ユーザーから実行すると、魔法のように機能しました。


3
all_tablesではなくpg_stat_user_tablesを使用する場合、grepは必要ありません...また、-A -tをpsqlに渡して、フォーマットされた出力を取り除きます。
マグナスハガンダー09

1
Postgres 9.0の時点で、この答えのアプローチは難しい方法であることに注意してください。9.xでは、この他の回答に「ON ALL」が表示されています
バジルブルク14

これは、テーブル名またはスキーマ名に大文字が含まれている場合は機能しません。以下に修正版を追加します
anneb

9

これは、2段階のプロセスで実行できます。

  1. このクエリを実行します。

    select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
    from pg_tables where schemaname in ('$bar', '$baz')
    order by schemaname, tablename;
    

    代替品:

    $foo=パーミッションを付与したいユーザー名
    $bar$baz=パーミッションを付与したいスキーマ(「パブリック」でも可)

  2. これにより、必要なアクセス許可を生成するクエリのリストが表示されます。出力をコピーし、別のクエリに貼り付けて実行します。


2

これは私が使用したものです:

psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname

SQLで書式設定とwhere-clausesを実行する方が自然だと思います。


2

私がやってしまったこれを、それが働きました:

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
GRANT SELECT ON TABLES TO PUBLIC;

1

私はpostgres 8.4で作業しており、ユーザーにすべての権限を与えるために次のことを行います:

#!/bin/bash

for table in `echo "SELECT schemaname||'.'||relname FROM pg_stat_all_tables WHERE schemaname NOT IN('pg_catalog','pg_toast','information_schema')" | psql -t db `;
do
    echo "grant select on table $table to my_new_user;"
    echo "grant select on table $table to my_new_user;" | psql db
done

1
英語でお願いします。
リンガー

0

これを修正する1つの方法は、ストアドプロシージャを記述することです。残念ながら、「すべてのテーブルにすべてを付与する」コマンドなどはありません。この手順を実行するには、おそらく手順または外部シェルスクリプトが必要です。


0

Adam Matanによる(ワンライナーソリューション)スクリプトは、多くのスキーマが存在する場合に最適ですが、スキーマ名またはテーブル名に大文字または特殊文字が含まれる場合は機能しません。

変更されたバージョン:

#!/bin/bash

for table in `echo "SELECT '\"' || schemaname || '\".\"' || relname || '\"'  FROM pg_stat_user_tables;" | psql -A -t my_database_name`;
do
    echo "GRANT SELECT ON TABLE $table to my_new_user;"
    echo "GRANT SELECT ON TABLE $table to my_new_user;" | psql my_database_name
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.