A versão curta primeiro:
É possível ter uma nova conexão de banco de dados PostgreSQL invocada automaticamente SET ROLE
com uma função específica, seja por configurações na função de conexão (usando ALTER ROLE
), ou uma opção no final de um URI de conexão?
Mais longo, com contexto:
Estou configurando um aplicativo da Web para usar credenciais de banco de dados rotativas (portanto, há uma variedade de funções em jogo). No entanto, essas credenciais também são usadas para modificações no banco de dados (via migrações do Rails), e isso significa que as tabelas se tornam propriedade de uma função que não deveria existir a longo prazo.
Eu posso modificar as credenciais rotativas para que elas herdem de uma função pai (que não tem a capacidade de fazer login) e, em seguida, SET ROLE
todas as modificações do banco de dados são de propriedade do pai, em vez da função filho de curto prazo. Isso resolve o problema de propriedade, mas exige que todas as conexões sejam invocadas SET ROLE parent
- não é realmente viável.
Portanto, quero uma maneira de garantir que cada conexão filha sempre opere dentro do contexto da função pai. Isso é possível?
Conforme respondido por @phemmer aqui, você pode usar
set
o comando assim:Dessa forma,
child_role
altere automaticamente paraparent_role
no login.Desde que
child_role
pertença aparent_role
.Editar após comentários:
Criação do objeto:
Criamos
my_schema
antes das configurações:Como vemos, o proprietário é
child_user
.Agora modificamos a configuração do usuário.
E criamos o
my_schema2
esquema:my_schema2
é de propriedade automática sem comandoparent_child
de tipo explícito .SET ROLE
Nota: A documentação especifica que ocorre somente no login.
Isso não é algo que o PostgreSQL possa fazer sozinho
Você deseja fazer isso em seu pool de conexões
Logo após obter uma conexão do pool, ligue
SET ROLE
Logo após liberar uma conexão com o pool, chame
RESET ROLE
Não é um cara do Ruby, então não posso ajudá-lo muito com isso, mas aqui está como você faria isso em Java: