====== 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