Gostaria de bloquear uma tabela: INSERT
deveria ser permitido, mas UPDATE
deveria ser desabilitado.
Estou usando uma versão atual do PostgreSQL.
Eu li Advisory Locks e bloqueio explícito . Talvez eu seja cego, mas não consegui encontrar uma solução adequada para o meu objetivo.
Aqui estão os detalhes do meu caso de uso:
Existe uma tabela que é mais ou menos como registro: vários processos adicionam novas linhas à tabela ao mesmo tempo.
Uma vez em uma hora um script processa os dados que foram adicionados.
Agora eu quero ter certeza de que este script tem um conjunto de trabalho fixo. Nenhuma modificação deve ser feita nas linhas nas quais o script está trabalhando. Mas tudo bem se novas linhas forem adicionadas enquanto os scripts são executados. Essas linhas obtêm processos com a próxima chamada do script.
Claro, você pode usar bloqueios em nível de linha para bloquear todas as linhas atualmente na tabela com:
Ou similar.
Mas isso impede todas as gravações, incluindo
DELETE
, não apenasUPDATE
- pela duração do bloqueio. E há a pergunta restante sobre as linhas inseridas depois disso: elas também não deveriam ser protegidas deUPDATE
?Do jeito que você expressou ( "
INSERT
deveria ser permitido, masUPDATE
deveria ser desabilitado." ), parece uma questão mais geral de gerenciamento de privilégios comGRANT
eREVOKE
, em vez de bloqueio.Algo como:
Ou:
Os comandos reais dependem de quem recebeu
GRANT
privilégios de edição em primeiro lugar e quem deve ser impedido de atualizar agora.Não se esqueça do caso especial do dono da mesa . O manual sobre
GRANT
:Enquanto os bloqueios duram apenas a duração de uma transação, o efeito é permanente - até que seja alterado explicitamente. Além disso, as fechaduras são caras.
GRANT
/REVOKE
é quase gratuito.Você precisa dos privilégios necessários. Seja o proprietário da tabela, seja membro na função que possui a tabela, seja um superusuário ou tenha recebido o mesmo privilégio
WITH GRANT OPTION
.Você poderia usar
pg_try_advisory_lock()
. Veja Bloqueios Consultivos