エラー:Postgresを使用して、シーケンスities_id_seqの許可が拒否されました


202

私はpostgres(およびデータベース情報システム全般)の初心者です。データベースで次のSQLスクリプトを実行しました。

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;

ユーザーwwwとして、次のことを試みた場合:

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

次のエラーが発生します。

ERROR: permission denied for sequence cities_id_seq

問題はシリアルタイプにあることがわかります。そのため、* _ id_seqの選択、挿入、削除の権限をwwwに付与しています。しかし、これは私の問題を解決しません。何が欠けていますか?


2
シーケンスに対して挿入/削除を許可することは、私には意味がありません。それがうまくいくのにも驚いています。
a_horse_with_no_name

回答:


360

PostgreSQL 8.2以降は以下を使用する必要があります:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

GRANT USAGE-シーケンスの場合、この権限により、currvalおよびnextval関数を使用できます。

また、コメントの@epic_filで指摘されているように、次のコマンドを使用して、スキーマ内のすべてのシーケンスに権限を付与できます。

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

52
参考までに、構文 "。。。ON ALL SEQUENCES IN SCHEMA schema_name"もサポートされています。
epic_fil 2013

5
面白い。シーケンスが入っているテーブルですべてGRANTを実行しましたが、これはシーケンスをカバーしていないようです。これもOSによると思われます。
Kinnard Hockenhull 2014年

41
これはどうして本当ですか?ユーザーがテーブルにデータを挿入できるようにしたいが、列の1つが自動インクリメントされているという事実をユーザーが使用できないようにしたい場合はいつですか?
Brett Widmeier、2016

5
IS SELECT必要?べきではありませんUSAGE必要なもの網羅!
TᴀʀᴇǫMᴀʜᴍᴏᴏᴅ

6
@BrettWidmeier正確に。開発者がこの種のことを容認する方法は、私にとって不思議です。それは、人々がインターネットを歩き回って、底なしのStackOverflowスレッドを読んで、箱から出してすぐに機能していたはずの問題を修正したいようなものです。
milosmns

67

@Philには、気付かないかもしれない多くの賛成票を取得しているコメントがあるため、彼の構文を使用して、スキーマ内のすべてのシーケンスに対してユーザーに権限を付与する回答を追加しています(スキーマがデフォルトの 'public'であると想定しています) )

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

2
これはPostgreSQL 9.0以降でのみ機能することに注意してください。8で同じことを行うには、次のようにします。SELECT 'GRANT USAGE、SELECT ON' || quote_ident(スキーマ名)|| 「」|| quote_ident(relname)|| 「wwwへ」FROM pg_statio_all_sequences WHERE schemaname = 'public'; –トムガーケン2日前
トムガーケン

39

@ Tom_Gerken、@ epic_fil、および@kupsonは、既存のシーケンスを操作するためのアクセス許可を与えるためのステートメントで非常に正確です。ただし、ユーザーは将来作成されるシーケンスへのアクセス権を取得しません。これを行うには、次のように、GRANTステートメントをALTER DEFAULT PRIVILEGESステートメントと組み合わせる必要があります。

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

もちろん、これはPostgreSQL 9以降でのみ機能します。

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


-2

postgresで以下のコマンドを実行します。

postgresにログイン:

sudo su postgres;

psql dbname;

CREATE SEQUENCE public.cities_id_seq INCREMENT 1
MINVALUE 0 MAXVALUE
1
START 1 CACHE 1; ALTER TABLE public.cities_id_seq OWNER TO pgowner;

pgownerがデータベースユーザーになります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.