Pular para o conteúdo principal

Questão de Banco de Dados — MySQL — FGV 2024

Banco de DadosMySQL
Código
fg165207
Banca
FGV
Órgão
TJ AP
Ano
2024
Cargo
AJ ( )
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):
  1. Au1 e u3 poderão executar a instrução INSERT INTO db.t1 VALUES ROW (2);
  2. Bu2 poderá executar a instrução UPDATE db.t1 SET c=2;
  3. Cu2 poderá conceder o privilégio de UPDATE para o usuário u1;
  4. Du1 e u3 poderão executar a instrução DELETE FROM db.t2;
  5. 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ê:

  1. CREATE DATABASE db; — cria o banco de dados db.

  2. 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.

  3. 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.

  4. CREATE USER u1; — cria o usuário u1.

  5. 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.

  6. CREATE USER u2; — cria o usuário u2.

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

  8. CREATE USER u3; — cria o usuário u3.

  9. 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).

  10. 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ê.

Gabarito: letra E

Link permanente: /questoes/fg165207