====== Usuários ======
==== Papéis e usuários ====
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 | {}
==== Concessão de privilégios ====
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