Usuários e grupos no PostgreSQL são igualmente chamados de roles - papéis.
Opções de criação de roles:
postgres-# \h CREATE ROLE Comando: CREATE ROLE Descrição: define uma nova ROLE do banco de dados Sintaxe: CREATE ROLE nome [ [ WITH ] opção [ ... ] ] onde opção pode ser: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMIT limite_conexão | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'senha' | VALID UNTIL 'tempo_absoluto' | IN ROLE nome_role [, ...] | IN GROUP nome_role [, ...] | ROLE nome_role [, ...] | ADMIN nome_role [, ...] | USER nome_role [, ...] | SYSID uid
Ou
postgres=# \h CREATE USER Comando: CREATE USER Descrição: define uma nova ROLE do banco de dados Sintaxe: CREATE USER nome [ [ WITH ] opção [ ... ] ] onde opção pode ser: SUPERUSER | NOSUPERUSER | CREATEDB | NOCREATEDB | CREATEROLE | NOCREATEROLE | CREATEUSER | NOCREATEUSER | INHERIT | NOINHERIT | LOGIN | NOLOGIN | REPLICATION | NOREPLICATION | BYPASSRLS | NOBYPASSRLS | CONNECTION LIMIT limite_conexão | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'senha' | VALID UNTIL 'tempo_absoluto' | IN ROLE nome_role [, ...] | IN GROUP nome_role [, ...] | ROLE nome_role [, ...] | ADMIN nome_role [, ...] | USER nome_role [, ...] | SYSID uid
Criando um papel com privilégios de superusuário:
postgres=# CREATE ROLE gean WITH SUPERUSER LOGIN; CREATE ROLE
Criando uma senha para o papel recém criado:
postgres=# \password gean Digite nova senha: Digite-a novamente:
OBS: Essa é a opção recomendada para a criação de senha evitando que a senha digitada fique salva no histórico de comandos.
Criando um papel sem privilégios de administrador e informando sua senha:
postgres=# CREATE ROLE bob WITH LOGIN PASSWORD 'senha'; CREATE ROLE
Criando um papel com senha e data de expiração:
postgres=# SELECT now() + INTERVAL '30 day'; ?COLUMN? ------------------------------ 2016-07-03 13:29:25.68897-03 (1 registro)
postgres=# CREATE ROLE alice WITH LOGIN PASSWORD 'senha' VALID UNTIL '2016-07-03 13:29:25.68897-03'; CREATE ROLE
Listando os roles criados:
postgres=# SELECT rolname,rolsuper,rolvaliduntil FROM pg_roles; rolname | rolsuper | rolvaliduntil ----------+----------+------------------------------ postgres | t | gean | t | bob | f | alice | f | 2016-07-03 13:29:25.68897-03
postgres=# \du Lista de roles Nome da ROLE | Atributos | Membro de --------------+-----------------------------------------------------------+----------- alice | Senha valida até 2016-07-03 13:29:25.68897-03 | {} bob | | {} gean | Super-usuário | {} postgres | Super-usuário, Cria ROLE, Cria BD, Replicação, Bypass RLS | {}
Os comandos para concessão e revogação de privilégios são, respectivamente, GRANT e REVOKE.
postgres=# \h GRANT Comando: GRANT Descrição: define privilégios de acesso Sintaxe: GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] nome_tabela [, ...] | ALL TABLES IN SCHEMA nome_esquema [, ...] } TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | INSERT | UPDATE | REFERENCES } ( nome_coluna [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( nome_coluna [, ...] ) } ON [ TABLE ] nome_tabela [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE nome_sequência [, ...] | ALL SEQUENCES IN SCHEMA nome_esquema [, ...] } TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE nome_banco_de_dados [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN nome_domínio [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER nome_fdw [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER nome_servidor [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION nome_função ( [ [ modo_argumento ] [ nome_argumento ] tipo_argumento [, ...] ] ) [, . ..] | ALL FUNCTIONS IN SCHEMA nome_esquema [, ...] } TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_linguagem [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_esquema [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE nome_tablespace [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] GRANT { USAGE | ALL [ PRIVILEGES ] } ON TYPE nome_tipo [, ...] TO role_specification [, ...] [ WITH GRANT OPTION ] WHERE role_specification can be: [ GROUP ] nome_role | PUBLIC | CURRENT_USER | SESSION_USER GRANT nome_role [, ...] TO nome_role [, ...] [ WITH ADMIN OPTION ]
postgres=# \h REVOKE Comando: REVOKE Descrição: remove privilégios de acesso Sintaxe: REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES | TRIGGER } [, ...] | ALL [ PRIVILEGES ] } ON { [ TABLE ] nome_tabela [, ...] | ALL TABLES IN SCHEMA nome_esquema [, ...] } FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | INSERT | UPDATE | REFERENCES } ( nome_coluna [, ...] ) [, ...] | ALL [ PRIVILEGES ] ( nome_coluna [, ...] ) } ON [ TABLE ] nome_tabela [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { USAGE | SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON { SEQUENCE nome_sequência [, ...] | ALL SEQUENCES IN SCHEMA nome_esquema [, ...] } FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | CONNECT | TEMPORARY | TEMP } [, ...] | ALL [ PRIVILEGES ] } ON DATABASE nome_banco_de_dados [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON DOMAIN nome_domínio [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN DATA WRAPPER nome_fdw [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON FOREIGN SERVER nome_servidor [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { EXECUTE | ALL [ PRIVILEGES ] } ON { FUNCTION nome_função ( [ [ modo_argumento ] [ nome_argumento ] tipo_argumento [, ...] ] ) [, . ..] | ALL FUNCTIONS IN SCHEMA nome_esquema [, ...] } FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON LANGUAGE nome_linguagem [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { SELECT | UPDATE } [, ...] | ALL [ PRIVILEGES ] } ON LARGE OBJECT loid [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { { CREATE | USAGE } [, ...] | ALL [ PRIVILEGES ] } ON SCHEMA nome_esquema [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { CREATE | ALL [ PRIVILEGES ] } ON TABLESPACE nome_tablespace [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ GRANT OPTION FOR ] { USAGE | ALL [ PRIVILEGES ] } ON TYPE nome_tipo [, ...] FROM { [ GROUP ] nome_role | PUBLIC } [, ...] [ CASCADE | RESTRICT ] REVOKE [ ADMIN OPTION FOR ] nome_role [, ...] FROM nome_role [, ...] [ CASCADE | RESTRICT ]
Revogando todos os privilégios do role bob ao banco postgres:
postgres=# REVOKE ALL ON DATABASE postgres FROM bob; REVOKE