2012-02-17 38 views
103

私はpostgres(およびデータベースインフォメーションシステム)の新機能です。ユーザーWWWようにしようとすると、エラー:Postgresを使用してcities_id_seqシーケンスの許可が拒否されました

create table cities (
id serial primary key, 
name text not null 
); 

create table reports (
id serial primary key, 
cityid integer not null references cities(id), 
reportdate date not null, 
reporttext text not null 
); 

create user www with password 'www'; 

grant select on cities to www; 
grant insert on cities to www; 
grant delete on cities to www; 

grant select on reports to www; 
grant insert on reports to www; 
grant delete on reports to www; 

grant select on cities_id_seq to www; 
grant insert on cities_id_seq to www; 
grant delete on cities_id_seq to www; 

grant select on reports_id_seq to www; 
grant insert on reports_id_seq to www; 
grant delete on reports_id_seq to www; 

insert into cities (name) values ('London'); 

私は次のエラーを取得:

ERROR: permission denied for sequence cities_id_seq 

を私がすることを得る私は私のデータベースにSQLスクリプトを次のよう走りました問題はシリアルタイプにあります。だから私は* _id_seqの選択、挿入、削除の権利をwwwに与えているのです。それでも私の問題は解決しません。私は何が欠けていますか?あなたが使用する必要がPostgreSQLの8.2以降

+1

シーケンスに挿入/削除を許可することは私には意味がありません。私はそれが機能することにも驚いています。 –

答えて

183

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www; 

GRANTの使用率が - 配列の場合、この権限はCURRVALとNEXTVALの機能を使用できます。あなたが、スキーマ内のすべての列に権限を付与することができますコメントで@epic_filによって指摘されているようにも

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www; 
+0

ありがとうございます。これは働いた。私がこれらの2つのテーブルに権利を与える方法が標準であるか、どこかでより受け入れられた標準があるのか​​どうか疑問に思うだけです。私は行を追加、編集、削除できるようにwwwが必要です。 – Vampnik

+0

@Vampnik:この場合、すべてのテーブルにUPDATEを追加する必要があります。シーケンスの場合、 'USAGE、SELECT'で十分です。 –

+0

@ A.H。最後のものありがとうございます。私自身も後者を発見しました。 – Vampnik

53

@Philが気付かない可能性がありますupvotesの多くを取得したコメントがありますので、 、私は、スキーマ内のすべてのシーケンスのためのユーザーに権限を付与します答えを追加するために彼の構文を使用してい

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www; 
+2

これはPostgreSQL 9.0以降でのみ機能し、8で同じことを達成するには、次のようなことができることに注意してください。SELECT 'GRANT USAGE、SELECT ON' || quote_ident(schemaname)|| '。' || quote_ident(relname)|| 'TO www;' FROM pg_statio_all_sequencesどこschemaname = 'パブリック'; - Tom Gerken 2日前 –

21

@Tom_Gerken、@epic_filと@kupson(スキーマと仮定して「国民のデフォルトです) exiで動作する権限を与えるためのステートメントではかなり正しいですスティッキングシーケンス。ただし、ユーザーは将来作成されるシーケンスへのアクセス権を取得しません。これを行うには、あなたはそうのような、ALTER DEFAULT PRIVILEGESステートメントとGRANTステートメントを組み合わせる必要があります:PostgreSQLの9+の

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO www; 
ALTER DEFAULT PRIVILEGES IN SCHEMA public 
    GRANT USAGE, SELECT ON SEQUENCES TO www; 

これだけ作品、もちろん。

これは既存のデフォルト権限に追加され、上書きされないため、その点ではかなり安全です。

関連する問題