Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg100799
Banca
FGV
Órgão
TRF - 1ª REGIÃO
Ano
2024
Nível
Superior
Cargo
Analista Judiciário - Área Apoio Especializado - Especialidade: Análise de Dados
No contexto do ambiente MySQL, considere o script abaixo.Imagem associada para resolução da questãoDe acordo com o que foi apresentado, conclui-se que:
  1. Aé gravado um registro na tabela t2 para todas as alterações de reescrita em t1;
  2. Bhá um erro, pois a cláusula “FOR EACH ROW” não se aplica nesse caso;
  3. Chá um erro, pois OLD e NEW não foram devidamente declarados;
  4. Dsão inseridos na tabela t2 todos os nomes presentes na tabela t1;
  5. Esão registradas na tabela t2 somente as operações de reescrita que alteraram o conteúdo da coluna nome de t1.
Revelar gabarito e comentário

GabaritoA — é gravado um registro na tabela t2 para todas as alterações de reescrita em t1;

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

Triggers no MySQL: FOR EACH ROW, OLD e NEW

Gabarito: letra A. O script cria uma trigger de atualização (UPDATE) na tabela t1 que, para cada linha alterada, insere um registro na tabela t2 com o valor antigo e o novo da coluna nome — ou seja, toda operação de reescrita em t1 gera um registro em t2, independentemente de o conteúdo da coluna ter mudado ou não. A alternativa E está incorreta porque a trigger não possui a condição IF NEW.nome <> OLD.nome, que seria necessária para filtrar apenas as alterações efetivas.

Uma trigger (gatilho) é um objeto de banco de dados que se associa a uma tabela e é executado automaticamente quando ocorre um evento de manipulação de dados (INSERT, UPDATE ou DELETE). No MySQL, a sintaxe básica é:

CREATE TRIGGER nome_trigger
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON tabela
FOR EACH ROW
BEGIN
    -- corpo da trigger
END;

A cláusula FOR EACH ROW indica que a trigger será executada uma vez para cada linha afetada pela operação. No caso de um UPDATE que modifica várias linhas, a trigger dispara para cada uma delas. Os qualificadores OLD e NEW dão acesso aos valores das colunas antes e depois da operação, respectivamente: OLD.coluna refere-se ao valor anterior à atualização, e NEW.coluna refere-se ao valor novo. Eles não precisam ser declarados — são palavras reservadas do próprio MySQL, disponíveis automaticamente dentro do corpo da trigger.

No script da questão, a trigger é do tipo AFTER UPDATE ON t1, e o corpo insere em t2 os valores OLD.nome e NEW.nome. Como não há nenhuma condição IF restringindo a execução, a trigger roda para todas as linhas atualizadas, mesmo que o valor da coluna nome permaneça idêntico. Por exemplo, se um comando UPDATE t1 SET nome = nome for executado, a trigger ainda assim insere um registro em t2, pois a linha foi "reescrita" (a operação de atualização ocorreu), ainda que o conteúdo não tenha mudado.

A pegadinha da questão está exatamente nesse ponto: muitos candidatos assumem que a trigger só registra alterações reais de conteúdo, mas, sem a condição IF NEW.nome <> OLD.nome, ela registra toda operação de UPDATE. A alternativa E descreve o comportamento que a trigger teria se houvesse essa condição — é o distrator clássico.

Guarde a distinção: trigger sem condição = registra todas as operações; trigger com IF NEW.coluna <> OLD.coluna = registra apenas alterações efetivas. É exatamente nessa fronteira que as alternativas se dividem.

  1. 1CREATE TRIGGER
  2. 2BEFORE/AFTER + evento
  3. 3ON tabela
  4. 4FOR EACH ROW
  5. 5Corpo (OLD/NEW)
LEVEL · soulevel.com.br

Alternativa A — ✅ Correta ⟵ GABARITO

A trigger é AFTER UPDATE ON t1 com FOR EACH ROW, e o corpo insere em t2 os valores de OLD.nome e NEW.nome. Como não há condição IF, ela dispara para toda linha atualizada em t1, registrando em t2 um registro para cada operação de reescrita — mesmo que o conteúdo da coluna nome não tenha mudado. A alternativa espelha exatamente o comportamento do script.

Alternativa B — ❌ Incorreta

A cláusula FOR EACH ROW é obrigatória na sintaxe de triggers do MySQL — sem ela, o script nem seria aceito. Ela determina que a trigger seja executada uma vez para cada linha afetada pela operação. Não há erro algum nesse ponto; a alternativa tenta confundir o candidato com uma suposta incompatibilidade inexistente.

Alternativa C — ❌ Incorreta

OLD e NEW são palavras reservadas do MySQL, disponíveis automaticamente dentro do corpo da trigger — não precisam ser declaradas. OLD refere-se aos valores anteriores à operação, e NEW aos valores posteriores. A ausência de declaração explícita não gera erro; a alternativa é falsa.

Alternativa D — ❌ Incorreta

A trigger insere em t2 apenas os registros das linhas que sofreram UPDATE em t1 — não insere todos os nomes presentes em t1. Se uma linha de t1 nunca for atualizada, ela não gera registro em t2. A alternativa confunde o comportamento da trigger com um simples INSERT INTO t2 SELECT nome FROM t1, que copiaria a tabela inteira.

Alternativa E — ❌ Incorreta

Esta é a pegadinha central. A trigger registra todas as operações de UPDATE, inclusive aquelas em que o valor da coluna nome não mudou. Para que apenas alterações efetivas fossem registradas, seria necessário adicionar uma condição IF NEW.nome <> OLD.nome no corpo da trigger. Como essa condição não existe, a alternativa está errada.

NÃO CAIA NESSA!

A banca explora a confusão entre "operação de reescrita" e "alteração de conteúdo". Sem a condição IF NEW.nome <> OLD.nome, a trigger registra toda atualização, mesmo que o valor permaneça igual. A alternativa E descreve o comportamento que a trigger teria com essa condição — é o distrator que derruba quem não conhece a sintaxe completa.

PEGA ESSA DICA!

Na prova, ao analisar triggers, verifique sempre se há condição IF no corpo. Se não houver, a trigger dispara para todas as linhas afetadas pela operação, independentemente de mudança de conteúdo. Essa é a diferença entre as alternativas A e E.

Gabarito: letra A

Link permanente: /questoes/fg100799