ОШИБКА: разрешение отклонено для последовательности city_id_seq с помощью Postgres

Я новичок в postgres (и в информационных системах базы данных). Я выполнил следующую sql script в моей базе данных:

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. Но это не устраняет мою проблему. Что мне не хватает?

Ответ 1

Начиная с PostgreSQL 8.2 вы должны использовать:

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;

Ответ 2

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

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

Ответ 3

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

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

Ответ 4

Выполните следующую команду в postgres.

войдите в postgres:

  sudo su postgres;

     

psql dbname;

     

СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ public.cities_id_seq   INCREMENT 1
  MINVALUE 0
  MAXVALUE 1
  НАЧАТЬ 1   КЭШ 1;   ALTER TABLE public.cities_id_seq ВЛАДЕЛЕЦ pgowner;

pgowner будет вашим пользователем базы данных.