web-dev-qa-db-ja.com

postgresqlのすべてのテーブルにSELECTを付与

SELECT権限新しいユーザー postgresqlに付与するワンライナーはありますか?

次の疑似コードを実装するもの:

GRANT SELECT ON TABLE * TO my_new_user;
94
Adam Matan

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

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

リンク です。

153
TimH

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

#!/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

特権ユーザーから実行すると、魅力のように動作しました。

12
Adam Matan

これは、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. これにより、必要な権限を生成するクエリのリストが表示されます。出力をコピーして別のクエリに貼り付け、実行します。

9
Ben Williams

私は this を実行してしまい、それはうまくいきました:

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

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

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

SQLで書式設定とwhere句を実行するほうが自然だと思います。

2
stox

私は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
wilson

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
0
anneb

これを修正する1つの方法は、ストアード・プロシージャーを作成することです。残念ながら、「すべてのテーブルにすべてを許可する」コマンドなどはありません。これを機能させるには、プロシージャまたはいくつかの外部シェルスクリプトが本当に必要です。

0
postgresql007