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


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;

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

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

Ответы:


10

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

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

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

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

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

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


Разве нам не нужно ОБНОВЛЕНИЕ ПОСЛЕДОВАТЕЛЬНОСТИ для этого?
любопытно

@anshupitlia: Нет. Как объяснено выше.
Эрвин Брандштеттер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.