SET ROLE

SET ROLE — define o identificador de usuário corrente da sessão corrente

Sinopse

SET [ SESSION | LOCAL ] ROLE nome_da_role
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE

Descrição

Este comando define o identificador de usuário corrente da sessão SQL corrente como sendo o nome_da_role. O nome da função de banco de dados pode ser escrito como um identificador, ou como um literal de cadeia de caracteres. Após executar SET ROLE, a verificação de permissões para os comandos SQL será realizada como se a função de banco de dados especificada fosse aquela que estabeleceu a conexão originalmente. Note que SET ROLE e SET SESSION AUTHORIZATION são exceções; as verificações de permissões para estes últimos continuam usando o usuário corrente da sessão e o usuário inicial da sessão (o usuário autenticado), respectivamente [161].

O usuário da sessão corrente deve ter a opção SET para o nome_da_role especificado, seja direta ou indiretamente por meio de uma cadeia de permissões com a opção SET. (Se o usuário da sessão for um superusuário, poderá ser selecionada qualquer função de banco de dados.)

Os modificadores SESSION e LOCAL agem da mesma forma que para o comando SET regular.

SET ROLE NONE define o identificador do usuário corrente para o identificador de usuário da sessão corrente, conforme retornado por session_user. RESET ROLE define o identificador do usuário corrente para a configuração de tempo de conexão especificada pelas opções de linha de comando, ALTER ROLE ou ALTER DATABASE, se alguma dessas configurações existirem. Caso contrário, RESET ROLE define o identificador do usuário corrente para o identificador de usuário da sessão corrente. Estas formas podem ser executadas por qualquer usuário.

Notas

O uso deste comando permite adicionar privilégios ou restringir privilégios de um usuário. Se a função de banco de dados do usuário da sessão tiver recebido permissão de ser membro com WITH INHERIT TRUE, ela possuirá automaticamente todos os privilégios inerentes a cada função de banco de dados desse tipo. Neste caso, SET ROLE na prática remove todos os privilégios, exceto aqueles que a função de banco de dados de destino possui diretamente ou herda. Por outro lado, se a função de banco de dados do usuário da sessão tiver recebido a permissões de ser membro com WITH INHERIT FALSE, os privilégios das funções de banco de dados concedidas não poderão ser usados ​​por padrão. Entretanto, se a função de banco de dados for recebida com WITH SET TRUE, o usuário da sessão poderá usar o comando SET ROLE para remover os privilégios atribuídos diretamente a ele e, em em seu lugar, obter os privilégios disponíveis para a função de banco de dados especificada. Se a função de banco de dados recebeu os privilégios com WITH INHERIT FALSE, SET FALSE, então os privilégios dessa função de banco de dados não poderão ser usados, seja com ou sem SET ROLE.

O comando SET ROLE tem efeitos comparáveis aos do comando SET SESSION AUTHORIZATION, mas as verificações de privilégio envolvidas são bem diferentes. Além disso, SET SESSION AUTHORIZATION determina quais funções de banco de dados são permitidas para comandos SET ROLE posteriores, enquanto alterar funções de banco de dados com SET ROLE não altera o conjunto de funções de banco de dados permitidas para um comando SET ROLE posterior.

O comando SET ROLE não processa as variáveis de sessão conforme especificado pelas configurações do comando ALTER ROLE da função de banco de dados; isto só acontece durante a conexão.

O comando SET ROLE não pode ser usado dentro de uma função SECURITY DEFINER.

Exemplos

postgres=# GRANT cristina TO halley;
GRANT ROLE
halley=> SELECT SESSION_USER, CURRENT_USER;
 session_user | current_user
--------------+--------------
 halley       | halley
(1 linha)
halley=> SET ROLE 'cristina';
SET
halley=> SELECT SESSION_USER, CURRENT_USER;
 session_user | current_user
--------------+--------------
 halley       | cristina
(1 linha)
halley=> SET ROLE NONE;
SET
halley=> SELECT SESSION_USER, CURRENT_USER;
 session_user | current_user
--------------+--------------
 halley       | halley
(1 linha)

Conformidade

O PostgreSQL permite a sintaxe de identificador ("nome_da_role"), enquanto o padrão SQL requer que o nome da função de banco de dados seja escrito como um literal cadeia de caracteres. O padrão SQL não permite este comando durante uma transação; o PostgreSQL não faz esta restrição, porque não há razão para isto. Os modificadores SESSION e LOCAL são uma extensão do PostgreSQL, assim como a sintaxe RESET.

Veja também

SET SESSION AUTHORIZATION


[161] O comando SET ROLE verifica se o ID de autorização da sessão é membro de uma função de banco de dados (role) específica. Um ID de autorização adquire a condição de membro de uma função de banco de dados quando esta função de banco de dados é concedida ao próprio ID de autorização, ou a um grupo ou função de banco de dados da qual o ID de autorização seja membro. IBM DB2 12.1.x – SET ROLE statement (N. T.)