ОШИБКА: отказано в разрешении для последовательности towns_id_seq с использованием Postgres - PullRequest
159 голосов
/ 17 февраля 2012

Я новичок в 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. Все же это не решает мою проблему. Чего мне не хватает?

Ответы [ 3 ]

282 голосов
/ 17 февраля 2012

Начиная с 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;
58 голосов
/ 25 марта 2015

Поскольку @Phil имеет комментарий, получающий много голосов, которые могут быть не замечены, я использую его синтаксис, чтобы добавить ответ, который предоставит пользователю разрешения для всех последовательностей в схеме (если ваша схема используется по умолчанию'public')

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public to www;
29 голосов
/ 07 июня 2016

@ 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+.

Это добавит к существующим привилегиям по умолчанию, а не перезапишет их, поэтому вполне безопасно в этом отношении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...