Я новичок в 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. Но это не решает мою проблему. Чего мне не хватает?
sql
postgresql
permissions
auto-increment
Vampnik
источник
источник
Ответы:
Начиная с PostgreSQL 8.2 вы должны использовать:
GRANT USAGE - для последовательностей эта привилегия позволяет использовать функции currval и nextval.
Также, как указано @epic_fil в комментариях, вы можете предоставить разрешения для всех последовательностей в схеме с помощью:
источник
SELECT
необходимо? Не должныUSAGE
охватывать то, что нужно?Поскольку у @Phil есть комментарий, который вызывает много положительных отзывов, которые могут быть не замечены, я использую его синтаксис, чтобы добавить ответ, который предоставит пользователю разрешения для всех последовательностей в схеме (при условии, что ваша схема по умолчанию является общедоступной). )
источник
@Tom_Gerken, @epic_fil и @kupson вполне корректны в своих утверждениях, чтобы дать разрешения для работы с существующими последовательностями. Однако пользователь НЕ получит права доступа к последовательностям, созданным в будущем. Для этого вам нужно объединить оператор GRANT с оператором ALTER DEFAULT PRIVILEGES, например, так:
Конечно, это работает только на PostgreSQL 9+.
Это добавит к существующим привилегиям по умолчанию, а не перезапишет их, поэтому вполне безопасно в этом отношении.
источник
Выполните следующую команду в postgres.
войти в postgres:
pgowner будет вашим пользователем базы данных.
источник