Observe o seguinte script de concessão de privilégios em MySQL: CREATE DATABASE db; CREATE TABLE db.t1 (c INT); INSERT INTO db.t1 VALUES ROW (1); CREATE TABLE db.t2 (c INT); INSERT INTO db.t2 VALUES ROW (1); CREATE USER u1; GRANT SELECT, INSERT, DELETE ON db.t1 TO u1; CREATE USER u2; GRANT SELECT, INSERT, UPDATE ON db.t2 TO u2 WITH GRANT OPTION; CREATE USER u3; GRANT ALL PRIVILEGES ON db.* TO u3; REVOKE INSERT ON db.t1 FROM u1; Após a execução do script apresentado, é correto afirmar que o(s) usuário(s):
Au1 e u3 poderão executar a instrução INSERT INTO db.t1 VALUES ROW (2);
Bu2 poderá executar a instrução UPDATE db.t1 SET c=2;
Cu2 poderá conceder o privilégio de UPDATE para o usuário u1;
Du1 e u3 poderão executar a instrução DELETE FROM db.t2;
Eu3 poderá conceder o privilégio de UPDATE para o usuário u1.
Revelar gabarito e comentário▾
GabaritoC — u2 poderá conceder o privilégio de UPDATE para o usuário u1;
Comentário gerado por IA. É um apoio ao estudo, ancorado em fontes, mas pode conter imprecisões — confira sempre na fonte oficial (lei, súmula, edital e gabarito da banca). Encontrou um erro? Use “Reportar”.
Privilégios no MySQL: GRANT, REVOKE e WITH GRANT OPTION
Gabarito: letra E. O usuário u3, ao receber ALL PRIVILEGES ON db.* (todos os privilégios sobre todas as tabelas do banco db), tem o privilégio de UPDATE sobre db.t1 e, por ter recebido todos os privilégios, pode concedê-lo a outros usuários. As demais alternativas falham por confundir o escopo dos privilégios concedidos a cada usuário, o efeito do REVOKE e o alcance do WITH GRANT OPTION.
O comando GRANT é a instrução da DCL (Data Control Language) usada para conceder privilégios a usuários ou papéis (roles) sobre objetos do banco de dados. Sua sintaxe básica é GRANT <lista de privilégios> ON <objeto> TO <usuário> [WITH GRANT OPTION]. O REVOKE faz o caminho inverso: retira privilégios anteriormente concedidos, com a sintaxe REVOKE <lista de privilégios> ON <objeto> FROM <usuário>. A opção WITH GRANT OPTION é o ponto central desta questão: quando um usuário recebe um privilégio com essa cláusula, ele adquire o direito de repassar aquele mesmo privilégio (sobre aquele mesmo objeto) a outros usuários. Sem ela, o usuário pode usar o privilégio, mas não pode concedê-lo a ninguém.
Vamos analisar o script passo a passo para entender quem tem o quê:
CREATE DATABASE db; — cria o banco de dados db.
CREATE TABLE db.t1 (c INT); e INSERT INTO db.t1 VALUES ROW (1); — cria a tabela t1 no banco db e insere uma linha.
CREATE TABLE db.t2 (c INT); e INSERT INTO db.t2 VALUES ROW (1); — cria a tabela t2 no banco db e insere uma linha.
CREATE USER u1; — cria o usuário u1.
GRANT SELECT, INSERT, DELETE ON db.t1 TO u1; — concede a u1 os privilégios SELECT, INSERT e DELETE somente sobre a tabela db.t1.
CREATE USER u2; — cria o usuário u2.
GRANT SELECT, INSERT, UPDATE ON db.t2 TO u2 WITH GRANT OPTION; — concede a u2 os privilégios SELECT, INSERT e UPDATE somente sobre a tabela db.t2, com a opção de conceder esses privilégios a outros usuários.
CREATE USER u3; — cria o usuário u3.
GRANT ALL PRIVILEGES ON db.* TO u3; — concede a u3 todos os privilégios sobre todas as tabelas do banco db (ou seja, sobre db.t1 e db.t2).
REVOKE INSERT ON db.t1 FROM u1; — revoga o privilégio INSERT de u1 sobre db.t1.
Após a execução do script, a situação dos privilégios é:
u1: SELECT e DELETE sobre db.t1 (INSERT foi revogado). Nenhum privilégio sobre db.t2.
u2: SELECT, INSERT e UPDATE sobre db.t2, com direito de conceder esses privilégios (WITH GRANT OPTION). Nenhum privilégio sobre db.t1.
u3: ALL PRIVILEGES sobre db.*, ou seja, todos os privilégios (SELECT, INSERT, UPDATE, DELETE, etc.) sobre db.t1 e db.t2. Como recebeu ALL PRIVILEGES, também tem o direito de conceder esses privilégios a outros usuários (o ALL PRIVILEGES inclui o GRANT OPTION).
A alternativa E afirma que u3 poderá conceder o privilégio de UPDATE para o usuário u1. Isso é verdadeiro, pois u3 tem ALL PRIVILEGES sobre db.*, o que inclui o privilégio UPDATE sobre db.t1 e o direito de concedê-lo (GRANT OPTION). Portanto, u3 pode executar GRANT UPDATE ON db.t1 TO u1;.
As demais alternativas estão incorretas:
A: u1 não tem INSERT sobre db.t1 (foi revogado), e u3 tem INSERT sobre db.t1, mas a alternativa diz que ambos poderão executar INSERT. Incorreta.
B: u2 não tem privilégio sobre db.t1, apenas sobre db.t2. Incorreta.
C: u2 tem WITH GRANT OPTION apenas sobre db.t2, não sobre db.t1. Incorreta.
D: u1 não tem privilégio sobre db.t2, e u3 tem DELETE sobre db.t2, mas a alternativa diz que ambos poderão executar DELETE. Incorreta.
Privilégios MySQL
1u1
db.t1
SELECT
DELETE
INSERT (revogado)
db.t2
Nenhum
2u2
db.t2
SELECT
INSERT
UPDATE
GRANT OPTION (só em t2)
db.t1
Nenhum
3u3
db.* (t1 e t2)
ALL PRIVILEGES
GRANT OPTION (pode conceder)
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
A alternativa afirma que u1 e u3 poderão executar INSERT INTO db.t1 VALUES ROW (2);. O erro está em incluir u1: o privilégio INSERT de u1 sobre db.t1 foi revogado pelo comando REVOKE INSERT ON db.t1 FROM u1;. Portanto, u1 não pode mais inserir em db.t1. u3, por ter ALL PRIVILEGES sobre db.*, pode inserir, mas a alternativa exige que ambos possam, o que é falso.
Alternativa B — ❌ Incorreta
A alternativa afirma que u2 poderá executar UPDATE db.t1 SET c=2;. O erro é que u2 recebeu privilégios somente sobre db.t2 (GRANT SELECT, INSERT, UPDATE ON db.t2 TO u2 WITH GRANT OPTION;). Ele não tem nenhum privilégio sobre db.t1, portanto não pode executar UPDATE em db.t1.
Alternativa C — ❌ Incorreta
A alternativa afirma que u2 poderá conceder o privilégio de UPDATE para o usuário u1. O erro é que u2 tem WITH GRANT OPTION apenas sobre db.t2, não sobre db.t1. Ele pode conceder UPDATE sobre db.t2 a outros usuários, mas não sobre db.t1, pois não possui esse privilégio.
Alternativa D — ❌ Incorreta
A alternativa afirma que u1 e u3 poderão executar DELETE FROM db.t2;. O erro está em incluir u1: u1 recebeu privilégios somente sobre db.t1 (SELECT, INSERT, DELETE), e o INSERT foi revogado. Ele não tem nenhum privilégio sobre db.t2. u3, por ter ALL PRIVILEGES sobre db.*, pode deletar de db.t2, mas a alternativa exige que ambos possam, o que é falso.
Alternativa E — ✅ Correta ⟵ GABARITO
A alternativa afirma que u3 poderá conceder o privilégio de UPDATE para o usuário u1. Isso é verdadeiro porque u3 recebeu ALL PRIVILEGES ON db.*, o que inclui o privilégio UPDATE sobre db.t1 e o direito de concedê-lo (GRANT OPTION). Portanto, u3 pode executar GRANT UPDATE ON db.t1 TO u1;.
PEGA ESSA DICA!
Para resolver questões de privilégios, monte uma tabela mental com os usuários nas linhas e os objetos (tabelas) nas colunas, anotando os privilégios de cada um. Isso evita confusão entre escopos e facilita identificar quem pode fazer o quê.