web-dev-qa-db-ja.com

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

私は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に付与します。しかし、これは私の問題を解決しません。私は何が欠けていますか?

150
Vampnik

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;
268
kupson

@Philにはコメントがあり、気付かないかもしれない多くの賛成票を受け取っているので、私は彼の構文を使用して、スキーマのすべてのシーケンスに対する権限をユーザーに付与する回答を追加しています(スキーマがデフォルトの「パブリック」であると仮定します) )

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

@ 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以降でのみ機能します。

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

29
Asfand Qazi

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がデータベースユーザーになります。

0
Shreeram