ПОМИЛКА: дозвіл відхилено для послідовності Cities_id_seq за допомогою Postgres


201

Я новачок у 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. Але це не вирішує мою проблему. Що я пропускаю?


2
Надання вставки / видалення на послідовність не має для мене сенсу. Я здивований, що це навіть працює.
a_horse_with_no_name

Відповіді:


359

Оскільки PostgreSQL 8.2 ви повинні використовувати:

GRANT USAGE, SELECT ON SEQUENCE cities_id_seq TO www;

ВИКОРИСТАННЯ ВИКОРИСТАННЯ - Для послідовностей ця привілей дозволяє використовувати функції currval і nextval.

Крім того, як в коментарях вказав @epic_fil, ви можете надати дозволи для всіх послідовностей схеми за допомогою:

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

52
FYI, також підтримується синтаксис ".... ВСІХ ПОСЛІДОВ У СХЕМІ" schema_name ".
epic_fil

5
Цікаво. Я зробив ГРАНТ усе на столі, в якому знаходиться моя послідовність, але це, здається, не охоплює послідовність. Це також дуже здається ОС.
Кіннард Хокенхолл

41
Як це справжня річ? Коли я хотів би дозволити користувачеві вставляти дані в таблицю, але НЕ хочу дозволити їм використовувати той факт, що один із стовпців збільшується автоматично?
Бретт Відм'єр

5
Чи SELECTпотрібно? Не повинен USAGEохоплювати те, що потрібно?
Tᴀʀᴇǫ Mᴀʜᴍᴏᴏᴅ

6
@BrettWidmeier Саме так. Мені вражає, як розробники переносять подібну річ. Наче людям хочеться блукати по Інтернету і читати бездонні теми StackOverflow, намагаючись виправити речі, які повинні були працювати прямо з коробки.
milosmns

67

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

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

2
Зауважте, що це працює лише в PostgreSQL 9.0 і новіших версій, для того, щоб виконати те саме в 8, ви можете зробити щось на кшталт: SELECT 'GRANT USAGE, SELECT ON' || quo_ident (схема схеми) || '.' || quo_ident (relname) || 'TO www;' FROM pg_statio_all_sequences WHERE schemaname = 'public'; - Том Геркен 2 дні тому
Том Геркен

39

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

Це додасть до існуючих привілеїв за замовчуванням, а не замінить їх, тому цілком безпечно в цьому плані.


-2

Виконайте наступну команду в postgres.

увійдіть у postgres:

sudo su postgres;

psql dbname;

СТВОРИТИ ПОСЛІД public.cities_id_seq ВИСНОВОК 1
МІНВАЛЮ 0
МАКСАЛЬНОСТІ 1
СТАРТ 1 КАШ 1; АЛЬТЕР ТАБЛИКА public.cities_id_seq ВЛАСНИК ДЛЯ pgowner;

pgowner буде користувачем вашої бази даних.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.