Questão de Banco de Dados — Consultas e Comandos em SQL — FGV 2024
Banco de Dados›Consultas e Comandos em SQL
Código
fg165244
Banca
FGV
Órgão
TJ MS
Ano
2024
Cargo
Tec NS ( )
Observe o script de criação e concessão de privilégios em Oracle:
----conexão no banco de dados xpto CONNECT adm@xpto
----criação de usuário no banco de dados xpto
CREATE USER user1 IDENTIFIED BY senha1 DEFAULT TABLESPACE "usr_dados" TEMPORARY TABLESPACE "temp" ACCOUNT UNLOCK; GRANT CONNECT TO user1; GRANT SELECT ANY TABLE TO user1; GRANT DELETE, UPDATE, INSERT ON apl.tab1 TO user1; GRANT DELETE, UPDATE, INSERT ON apl.tab2 TO user1; REVOKE SELECT ON apl.tab2 FROM user1;
Após a execução do script apresentado, é correto afirmar que "user1" tem permissão de executar qualquer Data Manipulation Language (DML):
Ana tabela "temp";
Bna tabela "apl.tab1";
Cna tabela "apl.tab2";
Dna tabela "usr_dados";
Eem todas as tabelas de "xpto".
Revelar gabarito e comentário▾
GabaritoB — na tabela "apl.tab1";
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 DML no Oracle: GRANT e REVOKE
Gabarito: letra B. O usuário user1 tem permissão de executar DML (INSERT, UPDATE, DELETE) apenas na tabela apl.tab1, pois recebeu explicitamente esses privilégios nessa tabela e, embora também os tenha recebido em apl.tab2, o comando REVOKE removeu o privilégio de SELECT — mas não os de DML — nessa segunda tabela. A permissão SELECT ANY TABLE é um privilégio de sistema que permite consultar qualquer tabela, mas não autoriza operações de manipulação de dados.
A questão cobra a compreensão de dois comandos da DCL (Data Control Language): GRANT, que concede privilégios, e REVOKE, que os revoga. No script, o usuário recebe três conjuntos de permissões: o privilégio de sistema CONNECT (permitindo conectar-se ao banco), o privilégio de sistema SELECT ANY TABLE (permitindo consultar qualquer tabela do banco) e privilégios de objeto DELETE, UPDATE, INSERT sobre as tabelas apl.tab1 e apl.tab2. Em seguida, o comando REVOKE SELECT ON apl.tab2 FROM user1 retira apenas o privilégio de SELECT sobre apl.tab2 — os privilégios de DML (INSERT, UPDATE, DELETE) concedidos anteriormente sobre essa tabela permanecem intactos.
A pegadinha central está em interpretar o efeito do REVOKE. Muitos candidatos assumem que revogar o SELECT sobre apl.tab2 também remove os demais privilégios, mas o REVOKE é específico: ele só retira o privilégio nomeado no comando. Assim, user1 continua podendo inserir, atualizar e excluir dados em apl.tab2, mas não pode mais consultá-la. Além disso, é preciso distinguir privilégios de sistema (como SELECT ANY TABLE, que valem para qualquer tabela do banco) de privilégios de objeto (como SELECT ON apl.tab1, que valem apenas para aquela tabela específica). O SELECT ANY TABLE não confere direito de DML — apenas de leitura.
Para fixar: DML (Data Manipulation Language) abrange os comandos INSERT, UPDATE, DELETE (e, em algumas classificações, o SELECT). A questão pergunta especificamente sobre "qualquer DML", ou seja, sobre a capacidade de executar operações de escrita. O SELECT ANY TABLE não se enquadra nisso, pois é apenas leitura. As tabelas temp e usr_dados são tablespaces (espaços de armazenamento), não tabelas — não faz sentido falar em permissão de DML sobre elas. A alternativa E (todas as tabelas de xpto) seria verdadeira apenas se o usuário tivesse um privilégio de sistema como INSERT ANY TABLE, UPDATE ANY TABLE ou DELETE ANY TABLE, o que não ocorre.
Guarde a distinção entre privilégio de sistema e privilégio de objeto: é exatamente nela que as alternativas se dividem. O SELECT ANY TABLE é um privilégio de sistema (afeta todas as tabelas), mas só concede leitura; os privilégios de DML foram concedidos como privilégios de objeto, tabela por tabela.
Tabela
INSERT
UPDATE
DELETE
SELECT
apl.tab1
✅
✅
✅
❌ (não concedido)
apl.tab2
✅
✅
✅
❌ (revogado)
Qualquer tabela (SELECT ANY TABLE)
❌
❌
❌
✅
Privilégios DML (Oracle)
1De sistema (banco inteiro)
SELECT ANY TABLE (só leitura)
INSERT/UPDATE/DELETE ANY TABLE (não concedido)
2De objeto (tabela específica)
apl.tab1
INSERT, UPDATE, DELETE
apl.tab2
INSERT, UPDATE, DELETE
SELECT (revogado)
3Efeito do REVOKE
Cirúrgico: só remove o privilégio nomeado
LEVEL · soulevel.com.br
Alternativa A — ❌ Incorreta
temp é o nome do tablespace temporário definido na criação do usuário (TEMPORARY TABLESPACE "temp"), não uma tabela. Tablespaces são estruturas de armazenamento físico, não objetos sobre os quais se concede DML. O usuário não recebeu nenhum privilégio sobre uma tabela chamada temp.
Alternativa B — ✅ Correta ⟵ GABARITO
O comando GRANT DELETE, UPDATE, INSERT ON apl.tab1 TO user1 concede exatamente os três privilégios de DML de escrita sobre a tabela apl.tab1. Nenhum comando posterior revoga esses privilégios, então user1 pode executar INSERT, UPDATE e DELETE nessa tabela. É a única tabela em que ele tem permissão plena de DML.
Alternativa C — ❌ Incorreta
Embora user1 tenha recebido GRANT DELETE, UPDATE, INSERT ON apl.tab2, o comando REVOKE SELECT ON apl.tab2 FROM user1 removeu apenas o privilégio de SELECT. Os privilégios de DML (INSERT, UPDATE, DELETE) sobre apl.tab2permanecem válidos. A alternativa está incorreta porque afirma que ele pode executar "qualquer DML" — mas ele não pode executar SELECT, que também é considerado DML em algumas classificações. A pergunta pede "qualquer DML", e a falta do SELECT torna a alternativa falsa.
Alternativa D — ❌ Incorreta
usr_dados é o tablespace padrão (DEFAULT TABLESPACE "usr_dados"), não uma tabela. Assim como temp, é uma estrutura de armazenamento, não um objeto de banco sobre o qual se concede DML.
Alternativa E — ❌ Incorreta
Para ter DML em todas as tabelas do banco, user1 precisaria de privilégios de sistema como INSERT ANY TABLE, UPDATE ANY TABLE e DELETE ANY TABLE. O que ele recebeu foi SELECT ANY TABLE (apenas leitura) e privilégios de objeto específicos para apl.tab1 e apl.tab2. Portanto, não tem permissão de DML em todas as tabelas de xpto.
NÃO CAIA NESSA!
A banca explora a confusão entre o efeito do REVOKE e a abrangência do SELECT ANY TABLE. O REVOKE é cirúrgico: só retira o privilégio nomeado. Revogar SELECT sobre apl.tab2 não remove os privilégios de INSERT, UPDATE e DELETE sobre ela. E o SELECT ANY TABLE é um privilégio de sistema que permite apenas leitura — não autoriza nenhuma operação de escrita. O candidato que pensa que "revogou tudo" ou que "SELECT ANY TABLE dá DML" cai direto nas alternativas C ou E.
PEGA ESSA DICA!
Na prova, separe mentalmente os privilégios em duas categorias: de sistema (afetam o banco inteiro, ex.: SELECT ANY TABLE) e de objeto (afetam uma tabela específica, ex.: INSERT ON apl.tab1). Para saber se um usuário pode executar DML em uma tabela, verifique se ele recebeu os privilégios de objeto correspondentes (INSERT, UPDATE, DELETE) sobre aquela tabela — e lembre-se de que o REVOKE só remove o que foi explicitamente nomeado.