DCL

DCL – Data Control Language

A DCL (Linguagem de Controle de Dados) é um conjunto de comandos SQL responsáveis pelo gerenciamento de acessos e permissões em bancos de dados relacionais. Seus principais comandos — GRANT e REVOKE — controlam quais usuários ou papéis (roles) podem executar operações específicas em objetos do banco (tabelas, views, procedures, etc.).

Conceitos Fundamentais

No PostgreSQL, a segurança é gerenciada por meio de papéis (roles), que podem representar usuários individuais ou grupos. Um papel pode:

  • Ter permissão de login (atuando como usuário).
  • Agrupar outros papéis (funcionando como um grupo de permissões).
  • Ser proprietário de objetos (como tabelas ou bancos de dados).

Comandos Principais

Comando Descrição Exemplo
CREATE ROLE Cria um novo papel (usuário ou grupo). CREATE ROLE analista WITH LOGIN PASSWORD 'senha123';
ALTER ROLE Modifica propriedades de um papel. ALTER ROLE analista WITH CREATEDB;
DROP ROLE Remove um papel. DROP ROLE analista;
GRANT Concede privilégios a um papel. GRANT SELECT ON clientes TO analista;
REVOKE Revoga privilégios. REVOKE INSERT ON pedidos FROM analista;

Opções do CREATE ROLE

Ao criar um papel, é possível definir atributos específicos:

  • LOGIN / NOLOGIN: Permite ou não conexão ao banco.
  • SUPERUSER / NOSUPERUSER: Define privilégios de superusuário.
  • CREATEDB / NOCREATEDB: Permite criar bancos de dados.
  • PASSWORD 'senha': Define uma senha (opcionalmente criptografada).
  • VALID UNTIL 'data': Expiração da conta.
  • CONNECTION LIMIT: Limite de conexões simultâneas.
CREATE ROLE auditor WITH
  LOGIN
  PASSWORD 'audit@2024'
  VALID UNTIL '2024-12-31'
  CONNECTION LIMIT 3;

Gerenciamento de Grupos

Papéis podem ser agrupados para facilitar o gerenciamento de permissões:

-- Cria um grupo
CREATE ROLE equipe_vendas;

-- Adiciona usuários ao grupo
GRANT equipe_vendas TO vendedor1, vendedor2;

-- Concede privilégios ao grupo
GRANT SELECT, INSERT ON vendas TO equipe_vendas;

-- Remove um usuário do grupo
REVOKE equipe_vendas FROM vendedor2;

Privilégios em Objetos

Os privilégios variam conforme o tipo de objeto. Os principais incluem:

  • Tabelas/Views: SELECT, INSERT, UPDATE, DELETE.
  • Funções: EXECUTE.
  • Esquemas: USAGE, CREATE.
-- Concede acesso a uma tabela
GRANT SELECT, UPDATE ON clientes TO analista;

-- Revoga todos os privilégios
REVOKE ALL ON pedidos FROM equipe_vendas;

Boas Práticas

  • Princípio do Menor Privilégio: Conceda apenas as permissões necessárias.
  • Use Grupos: Gerencie permissões por funções (ex: equipe_vendas).
  • Auditoria: Consulte pg_roles e information_schema.table_privileges para monitorar acessos.
  • Validade de Senhas: Defina VALID UNTIL para contas temporárias.

Exemplo Completo

Configuração de um sistema com papéis para diferentes níveis de acesso:

-- Cria papéis
CREATE ROLE admin WITH SUPERUSER CREATEDB CREATEROLE LOGIN PASSWORD 'Adm!n123';
CREATE ROLE leitor WITH LOGIN PASSWORD 'L3itur@';
CREATE ROLE editor WITH LOGIN PASSWORD 'Ed!t0r';

-- Concede privilégios
GRANT SELECT ON ALL TABLES IN SCHEMA public TO leitor;
GRANT SELECT, INSERT, UPDATE ON clientes, pedidos TO editor;

-- Cria um grupo e adiciona membros
CREATE ROLE equipe_marketing;
GRANT equipe_marketing TO leitor, editor;

Conclusão

O DCL é essencial para garantir a segurança e a governança de dados em bancos relacionais. Seu domínio permite implementar políticas de acesso granular, alinhadas a requisitos de compliance (como LGPD ou GDPR). No PostgreSQL, a flexibilidade dos papéis e a combinação de GRANT/REVOKE oferecem um controle robusto sobre quem pode acessar ou modificar cada objeto do banco.