MySQL: Gerenciamento de usuários e controle de permissões…

Última atualização: 2026-08-26

O controle de acesso é a base da segurança de bancos de dados — cada usuário só pode acessar os dados para os quais tem autorização.

Esta aula aborda o gerenciamento de usuários e permissões.

100%
graph TB
    A[MySQL Permission Levels] --> B[Global Permissions<br/>*.*]
    A --> C[Database Permissions<br/>mydb.*]
    A --> D[Table Permissions<br/>mydb.users]
    A --> E[Column Permissions<br/>mydb.users col]
    B --> B1[ALL/CREATE/RELOAD...]
    C --> C1[SELECT/INSERT/UPDATE/DELETE]
    D --> D1[SELECT/ALTER/INDEX...]
    E --> E1[SELECT col1, col2]

1. O que você vai aprender


2. Uma história real

(1) Problema: um erro com a conta root leva a um grande desastre

A equipe de desenvolvimento sempre havia se conectado ao banco de dados de produção usando a conta root — era prático, mas então, um dia, um desenvolvedor executou acidentalmente o DROP TABLE users, e os dados de 3 milhões de usuários desapareceram em um instante. Levou quatro horas para restaurar o backup; durante esse tempo, o serviço ficou completamente fora do ar, resultando em prejuízos diretos de mais de um milhão.

(2) Soluções para o sistema de permissões

Aplique o princípio do privilégio mínimo: conceda a cada função apenas as permissões necessárias. Os desenvolvedores recebem acesso somente para leitura, além de acesso de leitura e gravação aos repositórios de desenvolvimento; a equipe de operações possui permissões de gerenciamento para repositórios específicos; e o acesso root é restrito aos administradores de banco de dados (DBAs) que utilizam o bastion host.

Dimensão Sempre usar o usuário root Princípio do privilégio mínimo
Risco de operações acidentais Extremamente alto (pode excluir qualquer tabela) Extremamente baixo (permissões restritas)
Recuperação de desastres Difícil (impacto abrangente) Fácil (impacto limitado)
Histórico de auditoria Não é possível identificar o operador Rastreamento por usuário
Nível de segurança

3. Gerenciamento de usuários

▶ Exemplo: Criação de um usuário

SQL
-- Create a Local User
CREATE USER 'dev_user'@'localhost' IDENTIFIED BY 'DevPass123!';

-- Create a user who is allowed to connect remotely
CREATE USER 'remote_user'@'%' IDENTIFIED BY 'RemotePass123!';

-- Create a user allowed to connect from a specific IP
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'AppPass123!';
▶ Experimente

▶ Exemplo: Modificação e exclusão de usuários

SQL
-- Change Password
ALTER USER 'dev_user'@'localhost' IDENTIFIED BY 'NewPass123!';

-- Delete User
DROP USER 'dev_user'@'localhost';

-- View All Users
SELECT user, host FROM mysql.user;
▶ Experimente

4. Autorização de SUBVENÇÃO

▶ Exemplo: Gerenciamento de permissões

SQL
-- Grant All Privileges (Administrator)
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost';

-- Grant Permissions to a Specific Database
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'dev_user'@'localhost';

-- Grant Permissions on a Specific Table
GRANT SELECT ON mydb.users TO 'readonly'@'localhost';

-- Grant Permissions on Specific Columns
GRANT SELECT (username, email) ON mydb.users TO 'limited'@'localhost';

-- Refresh Permissions
FLUSH PRIVILEGES;
▶ Experimente

5. Níveis de permissão

Nível Sintaxe Descrição
Global *.* Todas as tabelas em todos os bancos de dados
Banco de dados mydb.* Todas as tabelas de um banco de dados específico
Tabela mydb.users Tabela específica
Coluna mydb.users(email) Coluna específica

6. REVOKE: Revogar permissões

SQL
-- Revoke All Permissions
REVOKE ALL PRIVILEGES ON *.* FROM 'dev_user'@'localhost';

-- Revoke Specific Permissions
REVOKE INSERT, DELETE ON mydb.* FROM 'dev_user'@'localhost';

FLUSH PRIVILEGES;

7. Permissões de visualização

SQL
-- View Current User Permissions
SHOW GRANTS;

-- View a Specific User's Permissions
SHOW GRANTS FOR 'dev_user'@'localhost';

8. Gerenciamento de usuários (MySQL 8.0+)

SQL
-- Create a role
CREATE ROLE 'app_read', 'app_write';

-- Grant privileges to roles
GRANT SELECT ON mydb.* TO 'app_read';
GRANT INSERT, UPDATE, DELETE ON mydb.* TO 'app_write';

-- Assign Roles to Users
GRANT 'app_read', 'app_write' TO 'dev_user'@'localhost';

-- Activate role
SET DEFAULT ROLE ALL TO 'dev_user'@'localhost';

❓ Perguntas Frequentes

P: Qual é a diferença entre 'user'@'localhost' e 'user'@'%'? R: “localhost” permite apenas conexões locais, enquanto “%” permite conexões de qualquer host.

P: É necessária uma instrução FLUSH PRIVILEGES após GRANT? R: Não é necessária quando se usa GRANT diretamente. Só é necessária quando se modifica a tabela mysql.user diretamente.

P: O que devo fazer se esquecer minha senha de root? R: Inicie o sistema ignorando a verificação de permissão, altere a senha e, em seguida, reinicie o sistema.

P: O que é WITH GRANT OPTION? R: Permite que um usuário conceda seus próprios privilégios a outras pessoas. A concessão desse privilégio deve ser feita com cautela para evitar a proliferação de privilégios.

P: Qual é a diferença entre uma função e um usuário? R: Uma função é um conjunto de permissões; ela não pode ser usada para fazer login diretamente. Depois que um usuário faz login, ele usa o comando SET ROLE para ativar uma função.


📖 Resumo


📝 Exercícios

  1. Questão básica (Dificuldade: ⭐): Crie um usuário somente leitura que possa apenas consultar o banco de dados mydb.

  2. Exercício avançado (Dificuldade: ⭐⭐): Crie uma função e atribua-a a um usuário.

  3. Questão de desafio (Dificuldade: ⭐⭐⭐): Elabore um esquema de permissões em que os desenvolvedores tenham acesso de leitura e gravação, a equipe de operações tenha acesso somente de leitura e os administradores tenham acesso total.

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%