SET ROLE — define o identificador de usuário corrente da sessão corrente
SET [ SESSION | LOCAL ] ROLE nome_da_role
SET [ SESSION | LOCAL ] ROLE NONE
RESET ROLE
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.
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.
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)
O PostgreSQL permite a sintaxe de identificador
("),
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 nome_da_role"SESSION e LOCAL
são uma extensão do PostgreSQL, assim como
a sintaxe RESET.
[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.)