Este comando define o identificador do usuário corrente no contexto da sessão SQL corrente como sendo o nome_do_papel. O nome do papel pode ser escrito como um identificador ou um literal cadeia de caracteres. Após a execução do comando SET ROLE, as verificações de permissão para os comandos SQL serão efetuadas como se o papel especificado tivesse sido o papel que realizou originalmente a conexão.
O nome_do_papel especificado deve ser um papel que o usuário da sessão corrente é membro (Se o usuário da sessão for um superusuário poderá especificar qualquer papel).
Os modificadores SESSION e LOCAL atuam da mesma forma que no comando SET comum.
As formas NONE e RESET redefinem o identificador do usuário corrente como sendo o identificador do usuário da sessão corrente. Estas formas podem ser executadas por qualquer usuário.
Utilizando este comando é possível adicionar ou restringir os próprios privilégios. Se o papel do usuário da sessão possuir o atributo INHERITS, então possuirá automaticamente todos os privilégios de todos os papéis para os quais pode executar SET ROLE; neste caso, o comando SET ROLE removerá todos os privilégios atribuídos diretamente para o usuário da sessão e aos outros papéis dos quais é membro, deixando apenas os privilégios disponíveis para o papel especificado. Por outro lado, se o papel do usuário da sessão possuir o atributo NOINHERITS, o comando SET ROLE removerá os privilégios atribuídos diretamente para o usuário da sessão, e para o lugar destes obterá todos os privilégios disponíveis para o papel especificado.
Em particular, quando um superusuário executa o comando SET ROLE especificando um papel que não é superusuário, perde seus privilégios de superusuário.
O comando SET ROLE possui efeitos comparáveis ao do comando SET SESSION AUTHORIZATION, mas as verificações de privilégio envolvidas são bastante diferentes. Além disso, o comando SET SESSION AUTHORIZATION determina quais papéis serão permitidos para os comandos SET ROLE posteriores, enquanto mudar papéis com o comando SET ROLE não muda o conjunto de papéis permitidos para um comando SET ROLE posterior.
SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- pedro | pedro SET ROLE 'paulo'; SELECT SESSION_USER, CURRENT_USER; session_user | current_user --------------+-------------- pedro | paulo
O PostgreSQL permite a sintaxe ("nome_do_papel") para o identificador, enquanto o padrão SQL requer que o nome do papel 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 fazê-la. Os modificadores SESSION e LOCAL são extensões do PostgreSQL, assim como a sintaxe RESET.