É 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?

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.


Não precisamos de UPDATE ON SEQUENCE para isso?
inquisitivo

@anshupitlia: Não. Como explicado acima.
Erwin Brandstetter
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.