私は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に付与します。しかし、これは私の問題を解決しません。私は何が欠けていますか?
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;
@Philにはコメントがあり、気付かないかもしれない多くの賛成票を受け取っているので、私は彼の構文を使用して、スキーマのすべてのシーケンスに対する権限をユーザーに付与する回答を追加しています(スキーマがデフォルトの「パブリック」であると仮定します) )
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;
@ 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以降でのみ機能します。
これにより、既存のデフォルト権限に上書きされずに追加されるため、その点で非常に安全です。
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がデータベースユーザーになります。