SELECT権限 を 新しいユーザー postgresqlに付与するワンライナーはありますか?
次の疑似コードを実装するもの:
GRANT SELECT ON TABLE * TO my_new_user;
9.0の時点で、postgresにはスキーマ内のすべてのテーブル(および他のオブジェクト)に対する特権を付与する構文があることに言及すると役立つと思いました:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO user;
リンク です。
私の(非ワンライナー)ソリューション:
#!/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
特権ユーザーから実行すると、魅力のように動作しました。
これは、2段階のプロセスで実行できます。
このクエリを実行します。
select 'grant all on '||schemaname||'.'||tablename||' to $foo;'
from pg_tables where schemaname in ('$bar', '$baz')
order by schemaname, tablename;
交換:
$foo
=アクセス許可を付与するユーザー名$bar
、$baz
=アクセス許可を付与するスキーマ(単に「パブリック」にすることができます)
これにより、必要な権限を生成するクエリのリストが表示されます。出力をコピーして別のクエリに貼り付け、実行します。
私は this を実行してしまい、それはうまくいきました:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO PUBLIC;
これは私が使用したものです:
psql dbname -tc "select 'grant select on '||relname||' to readonly;' from pg_stat_user_tables" | psql dbname
SQLで書式設定とwhere句を実行するほうが自然だと思います。
私は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
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
これを修正する1つの方法は、ストアード・プロシージャーを作成することです。残念ながら、「すべてのテーブルにすべてを許可する」コマンドなどはありません。これを機能させるには、プロシージャまたはいくつかの外部シェルスクリプトが本当に必要です。