Uma função de banco de dados pode ter vários atributos que definem seus privilégios, e interagem com o sistema de autenticação de cliente.
Apenas as funções de banco de dados que possuem o atributo
LOGIN definido podem ser usadas como o nome
da função de banco de dados para estabelecer a conexão inicial
com o servidor de banco de dados.
Uma função de banco de dados com o atributo
LOGIN definido pode ser considerada igual
a um “usuário do banco de dados”.
Para criar uma função de banco de dados com privilégio de
conexão, podem ser usados os comandos:
CREATE ROLEnomeLOGIN; CREATE USERnome;
(O comando CREATE USER é equivalente ao
comando CREATE ROLE, exceto pelo comando
CREATE USER incluir LOGIN
por padrão, enquanto o comando CREATE ROLE
não inclui.)
Um superusuário do banco de dados ignora todas as verificações
de permissão, exceto o direito de se conectar.
É um privilégio perigoso, não devendo ser usado descuidadamente;
é melhor fazer a maior parte do trabalho como uma função de
banco de dados que não seja superusuário.
Para criar um novo superusuário de banco de dados, é usado o
comando CREATE ROLE .
Deve ser executado por uma função de banco de dados que já é
um superusuário.
nome
SUPERUSER
A função de banco de dados deve receber permissão explícita
para criar bancos de dados
(exceto para os superusuários, já que ignoram todas as
verificações de permissão).
Para criar uma função de banco de dados assim, é usado o comando
CREATE ROLE .
nome
CREATEDB
Uma função de banco de dados deve receber permissão explícita
para criar outras funções de banco de dados
(exceto para os superusuários, já que ignoram todas as
verificações de permissão).
Para criar uma função de banco de dados com esta permissão,
é usado o comando
CREATE ROLE .
Uma função de banco de dados com o atributo
nome
CREATEROLECREATEROLE pode alterar e remover
funções de banco de dados que possuam o atributo
CREATEROLE com a opção ADMIN.
Este privilégio ocorre automaticamente quando um usuário com o
atributo CREATEROLE — que não seja
um superusuário — cria uma nova função de banco de dados;
assim, por padrão, um usuário com o atributo
CREATEROLE pode alterar e remover os
privilégios das funções de banco de dados que ele mesmo criou.
Alterar uma função de banco de dados inclui a maioria das
alterações que podem ser feitas usando o comando
ALTER ROLE, incluindo, por exemplo,
a alteração de senhas.
Também inclui modificações em uma função de banco de dados que
podem ser feitas usando os comandos COMMENT
e SECURITY LABEL.
Entretanto, o atributo CREATEROLE não
confere a capacidade de criar funções de banco de dados
com o atributo SUPERUSER, nem confere
qualquer poder sobre as funções de banco de dados
com o atributo SUPERUSER já existentes.
Além disso, o atributo CREATEROLE não
confere o poder de criar usuários com o atributo
REPLICATION, nem a capacidade de conceder
ou revogar o atributo REPLICATION, nem a
capacidade de modificar as propriedades de função de banco de
dados de tais usuários.
Entretanto, permite executar ALTER ROLE ... SET
e ALTER ROLE ... RENAME em funções de banco
de dados de REPLICATION,
assim como executar COMMENT ON ROLE,
SECURITY LABEL ON ROLE e
DROP ROLE.
Por fim, CREATEROLE não confere a capacidade
de conceder ou revogar o atributo BYPASSRLS.
A função de banco de dados deve receber permissão explícita
para iniciar replicação por fluxo
(exceto para os superusuários, já que ignoram todas as
verificações de permissão).
Uma função de banco de dados usada para replicação por fluxo
também deve ter a permissão de LOGIN.
Para criar uma função de banco de dados assim, é usado o comando
CREATE ROLE .
nome
REPLICATION LOGIN
A senha só terá significado se o método de autenticação de
cliente exigir que o usuário forneça uma senha para se conectar
com o servidor de banco de dados.
Os métodos de autenticação password e
md5 usam senha.
As senhas do banco de dados são distintas das senhas do
sistema operacional.
A senha é especificada na criação da função de banco de dados
usando CREATE ROLE .
(Veja Autenticação por senha.)
nome
PASSWORD 'cadeia_de_caracteres'
Por padrão, uma função de banco de dados herda os privilégios
das funções de banco de dados das quais é membro.
Entretanto, para criar uma função de banco de dados que não
herde os privilégios por padrão, deve ser usado
CREATE ROLE .
Como alternativa, o privilégio de herdar pode ser sobreposto
para concessões individuais usando
nome
NOINHERITWITH INHERIT TRUE ou
WITH INHERIT FALSE.
Uma função deve receber permissão explícita para ignorar todas
as políticas de segurança no nível de linha (RLS)
(exceto para superusuários, uma vez que eles ignoram todas as
verificações de permissão).
Para criar uma função de banco de dados assim, é usado o comando
CREATE ROLE
como superusuário.
nome BYPASSRLS
O limite de conexões pode especificar quantas conexões
simultâneas uma função de banco de dados pode estabelecer.
-1 (o padrão) significa sem limite.
Deve-se especificar o limite de conexões ao criar a
função de banco de dados com
CREATE ROLE .
nome
CONNECTION LIMIT 'inteiro'
Os atributos da função de banco de dados podem ser modificados
após a criação usando o comando ALTER ROLE.
Veja as páginas de referência dos comandos
CREATE ROLE e ALTER ROLE
para obter detalhes.
Uma função de banco de dados também pode configurar suas opções padrão para muitos dos parâmetros de configuração descritos em Configuração do servidor. Por exemplo, se por algum motivo se quiser desativar as varreduras de índice (dica: não é uma boa ideia) sempre que se conectar, pode-se usar:
ALTER ROLE meu_nome SET enable_indexscan TO off;
Este comando irá salvar a configuração
(mas não irá defini-la imediatamente).
Nas próximas conexões realizadas por esta função de banco de dados,
vai parecer como se SET enable_indexscan TO off
tivesse sido executado logo antes do início da sessão.
Ainda será possível alterar esta configuração durante a sessão;
será apenas a configuração padrão.
Para restabelecer uma determinada definição padrão da função de
banco de dados, é usado o comando
ALTER ROLE .
Note-se que os valores predefinidos específicos da função de banco de
dados, atribuídos às funções de banco de dados sem o atributo
nome
RESET parâmetro_de_configuraçãoLOGIN, são bem inúteis, porque nunca serão usados.
Quando um usuário sem privilégios de superusuário cria uma
função de banco de dados usando o atributo CREATEROLE,
a função de banco de dados criada é automaticamente concedida de volta
ao usuário que a criou, exatamente como se o superusuário de ativação
do servidor (bootstrap superuser)
tivesse executado o comando GRANT usuário_criado TO
usuário_criador WITH ADMIN TRUE, SET FALSE, INHERIT FALSE.
Como um usuário com o atributo CREATEROLE só pode
exercer privilégios especiais sobre uma função de banco de
dados existente se possuir o privilégio ADMIN OPTION
sobre ela, esta permissão é suficiente apenas para permitir que um
usuário com o atributo CREATEROLE administre as
funções de banco de dados que ele mesmo criou.
Entretanto, como foi criado com
INHERIT FALSE, SET FALSE,
o usuário com CREATEROLE não herda os privilégios
da função de banco de dados criada, nem pode acessar os privilégios
dessa função de banco de dados usando SET ROLE.
Entretanto, como qualquer usuário que tenha a opção
ADMIN OPTION em uma função de banco de dados pode
conceder a participação nesta função de banco de dados a qualquer
outro usuário, o usuário com CREATEROLE pode obter
acesso à função de banco de dados criada simplesmente concedendo
esta função de banco de dados a si mesmo com as opções
INHERIT e/ou SET.
Assim, o fato de que privilégios não são herdados por padrão, nem
SET ROLE é concedido por padrão, constitui uma
salvaguarda contra acidentes, e não um recurso de segurança.
Note-se também que, como esta concessão automática é realizada pelo
superusuário de ativação do servidor, ela não pode ser removida ou
alterada pelo usuário com CREATEROLE;
entretanto, qualquer superusuário poderia revogá-la, modificá-la e/ou
conceder permissões adicionais desse tipo a outros usuários com o
atributo CREATEROLE.
Quaisquer usuários com CREATEROLE que possuam
ADMIN OPTION sobre uma função de banco de dados
em um determinado momento podem administrá-la.