Funções e privilégios
Conceda e revogue acesso com GRANT e REVOKE.
Funções e privilégios é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
O que são papéis e privilégios?
Em SQL, papéis são grupos nomeados de privilégios que podem ser atribuídos a usuários. Privilégios controlam quais ações um usuário ou papel pode realizar em objetos do banco de dados, como tabelas, visões e funções.
Em vez de conceder permissões a cada usuário individualmente, você cria um papel com os privilégios necessários e depois atribui esse papel a vários usuários de uma só vez. Isso facilita muito o gerenciamento do controle de acesso em grande escala.
Criando um papel
Use CREATE ROLE para definir um novo papel no PostgreSQL. Um papel pode representar um único usuário ou um grupo de usuários, dependendo de como for configurado.
Os papéis são criados sem privilégios por padrão — é preciso conceder explicitamente acesso a objetos.
CREATE ROLE readonly_user;
CREATE ROLE app_writer;
CREATE ROLE db_admin;Concedendo privilégios de tabela
A instrução GRANT concede a um papel ou usuário permissão para realizar operações específicas em um objeto do banco de dados. Entre os privilégios comuns no nível da tabela estão SELECT, INSERT, UPDATE e DELETE.
Você pode conceder um único privilégio ou vários de uma só vez, separando-os por vírgulas.
-- Grant SELECT only (read-only role)
GRANT SELECT ON employees TO readonly_user;
-- Grant multiple privileges
GRANT SELECT, INSERT, UPDATE ON orders TO app_writer;Concedendo todos os privilégios
Se um papel precisar de acesso total a uma tabela, você poderá usar GRANT ALL PRIVILEGES em vez de listar cada permissão individualmente. Isso concede todos os privilégios aplicáveis ao objeto especificado.
Tenha cuidado com ALL PRIVILEGES — conceda-o somente a papéis que realmente precisem de controle completo sobre o objeto.
-- Grant full access to db_admin on a table
GRANT ALL PRIVILEGES ON employees TO db_admin;
-- Or the shorthand form
GRANT ALL ON orders TO db_admin;Revogando privilégios
A instrução REVOKE remove privilégios anteriormente concedidos de um papel ou usuário. É assim que você restringe o acesso quando os requisitos mudam ou um papel deixa de precisar de determinadas permissões.
Depois de um REVOKE, o papel afetado perde imediatamente o privilégio especificado no objeto nomeado.
-- Remove UPDATE access from app_writer
REVOKE UPDATE ON orders FROM app_writer;
-- Remove all privileges from a role
REVOKE ALL PRIVILEGES ON employees FROM readonly_user;Atribuindo um papel a um usuário
No PostgreSQL, os usuários também são papéis — um papel com o atributo LOGIN pode se conectar ao banco de dados. Você atribui um papel de grupo a um papel de login usando GRANT role TO user.
Uma vez atribuído, o usuário herda todos os privilégios pertencentes a esse papel, o que facilita o gerenciamento das permissões de vários usuários de uma só vez.
-- Create a login user
CREATE ROLE alice WITH LOGIN PASSWORD 'secret123';
-- Assign the readonly role to alice
GRANT readonly_user TO alice;
-- Alice can now SELECT on tables granted to readonly_userRevogando um papel de um usuário
Para remover a atribuição de um papel a um usuário, use REVOKE role FROM user. Depois disso, o usuário deixa de herdar os privilégios associados a esse papel.
Isso é útil quando um funcionário muda de responsabilidades ou deixa a organização — você pode revogar o papel sem alterar as próprias definições de privilégios do papel.
-- Remove the readonly role from alice
REVOKE readonly_user FROM alice;
-- Alice no longer has SELECT on tables via that rolePrivilégios no nível do schema
Antes de um papel poder acessar qualquer objeto dentro de um schema, ele precisa do privilégio USAGE nesse schema. Sem ele, mesmo um papel com SELECT em uma tabela específica não consegue ler os dados porque não pode resolver o caminho do schema.
Conceda sempre USAGE no schema juntamente com os privilégios no nível do objeto.
-- Allow readonly_user to see inside the public schema
GRANT USAGE ON SCHEMA public TO readonly_user;
-- Then grant table-level privilege
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly_user;Privilégios padrão para objetos futuros
Quando novas tabelas são criadas em um schema, os papéis existentes não obtêm acesso automaticamente. Use ALTER DEFAULT PRIVILEGES para garantir que objetos futuros criados por um papel específico fiquem automaticamente acessíveis a outro papel.
Isso evita uma armadilha comum em que uma tabela recém-criada fica invisível para os papéis da aplicação até que alguém se lembre de executar GRANT manualmente.
-- Future tables created by the current user will be SELECTable by readonly_user
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO readonly_user;
-- Future tables will allow INSERT/UPDATE/DELETE for app_writer
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_writer;A cláusula WITH GRANT OPTION
Por padrão, um papel que recebe um privilégio não pode repassá-lo a outros papéis. Adicionar WITH GRANT OPTION permite que o destinatário também conceda esse privilégio a outras pessoas.
Use isso com cuidado — o papel se torna um ponto confiável de delegação do controle de acesso, o que pode complicar a auditoria se essa opção for usada em excesso.
-- app_writer can now grant SELECT on orders to other roles
GRANT SELECT ON orders TO app_writer WITH GRANT OPTION;
-- app_writer can then do:
-- GRANT SELECT ON orders TO reporting_role;Visualizando privilégios concedidos
O PostgreSQL armazena informações sobre privilégios em visões do catálogo do sistema. Você pode consultar information_schema.role_table_grants para ver quais papéis receberam quais privilégios em quais tabelas.
O comando de barra invertida \dp tablename do psql também mostra a lista compacta de privilégios de acesso de uma tabela.
-- List all table-level grants in the current database
SELECT grantee, table_schema, table_name, privilege_type
FROM information_schema.role_table_grants
WHERE table_schema = 'public'
ORDER BY grantee, table_name;Verificação rápida
Teste sua compreensão de papéis e privilégios em SQL.
Recapitulação: papéis e privilégios
Nesta lição, você aprendeu como o SQL gerencia o controle de acesso por meio de papéis e privilégios:
- CREATE ROLE define um novo papel ou uma nova conta de usuário
- GRANT atribui privilégios (SELECT, INSERT, UPDATE, DELETE, ALL) em objetos a um papel
- REVOKE remove esses privilégios
- GRANT papel TO usuário atribui um papel de grupo a um usuário de login para que ele herde seus privilégios
- Os papéis precisam de USAGE no schema antes de poderem acessar objetos dentro dele
- ALTER DEFAULT PRIVILEGES garante que objetos futuros fiquem automaticamente acessíveis
- WITH GRANT OPTION permite que o destinatário delegue o privilégio novamente
Manter os privilégios mínimos e baseados em papéis é um princípio fundamental do projeto seguro de bancos de dados — conceda apenas o necessário e revogue prontamente quando ele não for mais necessário.
Perguntas Frequentes
A aula “Funções e privilégios” é grátis?
Sim — o texto completo de “Funções e privilégios” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Funções e privilégios”?
Conceda e revogue acesso com GRANT e REVOKE. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Funções e privilégios”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Funções e privilégios
- Políticas de segurança em nível de linha
- Permissões em nível de coluna
- Auditando o acesso