É necessário conceder explicitamente permissões para atualizar a sequência para uma coluna serial?

9

Recentemente, criei uma tabela como superusuário, incluindo uma coluna de identificação serial, por exemplo,

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

Como eu queria que meu usuário não superusuário tivesse acesso de gravação a essa tabela, concedai permissões:

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

Em um momento aleatório após isso, as inserções feitas por esse usuário começaram a falhar porque o usuário não tinha permissão para modificar a sequência my_table_id_seqassociada à coluna serial. Infelizmente não consigo reproduzir isso no meu banco de dados atual.

Eu trabalhei em torno disso, dando ao usuário a permissão necessária, assim:

grant all on table my_table_id_seq to writer;

Alguém pode me ajudar a entender

  • por que, em algum momento, as permissões anteriormente suficientes podem começar a falhar?
  • qual é a maneira correta de conceder permissão de gravação para uma tabela com uma coluna serial?
moooeeeep
fonte

Respostas:

10

Você provavelmente precisa de:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

Por documentação:

USO
...
Para seqüências, esse privilégio permite o uso das funções currvale nextval.

nextval()é o motivo pelo qual você precisa do USAGEprivilégio na sequência para uma tabela com serialcoluna.
Detalhes nesta resposta relacionada ao SO.

Como uma sequência é um tipo especial de tabela (e por razões históricas) também GRANT ... ON TABLEfunciona em seqüências. Mas você normalmente não precisa disso.

Erwin Brandstetter
fonte
Não precisamos de UPDATE ON SEQUENCE para isso?
inquisitivo
@anshupitlia: Não. Como explicado acima.
Erwin Brandstetter