Явно предоставить разрешения на обновление последовательности для последовательного столбца?

9

Недавно я создал таблицу в качестве суперпользователя, включая столбец с серийным идентификатором, например,

create table my_table
(
    id serial primary key,
    data integer
);

Поскольку я хотел, чтобы мой пользователь, не являющийся суперпользователем, имел доступ для записи в эту таблицу, я предоставил ей разрешения:

grant select, update, insert, delete on table my_table to writer;

В случайный момент времени после этого вставки, сделанные этим пользователем, начали давать сбой, потому что у пользователя не было разрешения изменить последовательность, my_table_id_seqсвязанную с последовательным столбцом. К сожалению, я не могу воспроизвести это в моей текущей базе данных.

Я решил эту проблему, предоставив пользователю необходимые разрешения, например:

grant all on table my_table_id_seq to writer;

Может кто-нибудь помочь мне понять

  • почему в какой-то момент ранее достаточные разрешения могут начать сбоить?
  • Как правильно предоставить разрешение на запись для таблицы с последовательным столбцом?
moooeeeep
источник

Ответы:

10

Скорее всего, вам нужно:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

По документации:

ПРИМЕНЕНИЕ
...
Для последовательностей, эта привилегия позволяет использование currvalи nextvalфункции.

nextval()является причиной того, что вам нужна USAGEпривилегия для последовательности для таблицы со serialстолбцом.
Подробности в этом связанном ответе на SO.

Поскольку последовательность - это особый вид таблицы (и по историческим причинам), она GRANT ... ON TABLEработает и с последовательностями. Но обычно вам это совсем не нужно.

Эрвин Брандштеттер
источник
Разве нам не нужно ОБНОВЛЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ для этого?
любопытно
@anshupitlia: Нет. Как объяснено выше.
Эрвин Брандштеттер