Assinale a opção que indica o comando que só pode ser definido para executar em nível de instrução no banco de dados PostgreSQL.
Aafter
Btruncate
Cupdate
Dinstead of
Ebefore
Revelar gabarito e comentário▾
GabaritoB — truncate
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”.
PostgreSQL: Gatilhos (Triggers) – Nível de Instrução vs. Nível de Linha
Gabarito: letra B (truncate). No PostgreSQL, o comando TRUNCATE só pode acionar gatilhos definidos em nível de instrução (FOR EACH STATEMENT), pois é uma operação de DDL que não trabalha com linhas individuais. Já comandos como after, update, instead of e before podem ser configurados em nível de linha (FOR EACH ROW) ou de instrução, exceto instead of, que é sempre row-level em views.
A banca testa o conhecimento sobre os tipos de gatilho no PostgreSQL: a diferença entre o escopo de execução (linha vs. instrução) e quais eventos aceitam cada nível.
Comando
Nível de Gatilho Permitido
Tipo de Operação
Observação
TRUNCATE
Somente FOR EACH STATEMENT
DDL
Único comando que só aceita nível de instrução
AFTER
FOR EACH ROW ou FOR EACH STATEMENT
DML
Pode ser definido em ambos os níveis
BEFORE
FOR EACH ROW ou FOR EACH STATEMENT
DML
Pode ser definido em ambos os níveis
UPDATE
FOR EACH ROW ou FOR EACH STATEMENT
DML
Pode ser definido em ambos os níveis
INSTEAD OF
Somente FOR EACH ROW
DML (em views)
Sempre row-level, nunca statement-level
Gatilhos no PostgreSQL: Nível de instrução (FOR EACH STATEMENT) (TRUNCATE (DDL), CREATE, ALTER, DROP); Nível de linha (FOR EACH ROW) (INSERT, UPDATE, DELETE (DML), INSTEAD OF (sempre row-level)); Ambos os níveis (AFTER (DML), BEFORE (DML))
Alternativa A — ❌ Incorreta
AFTER é um gatilho de evento DML (INSERT, UPDATE, DELETE) que pode ser definido tanto como FOR EACH ROW quanto FOR EACH STATEMENT. Portanto, não é restrito a nível de instrução.
Alternativa B — ✅ Correta ⟵ GABARITO
O TRUNCATE é um comando DDL que remove todas as linhas de uma tabela de uma só vez, sem percorrê-las uma a uma. Por isso, o PostgreSQL só permite gatilhos associados a TRUNCATE como FOR EACH STATEMENT. Qualquer trigger nesse evento deve ser statement-level.
Alternativa C — ❌ Incorreta
UPDATE é um comando DML e pode disparar gatilhos tanto row-level quanto statement-level. Não há restrição de nível.
Alternativa D — ❌ Incorreta
INSTEAD OF é usado tipicamente em views e, no PostgreSQL, é sempre FOR EACH ROW (nível de linha). Ele não pode ser definido em nível de instrução.
Alternativa E — ❌ Incorreta
BEFORE é um gatilho DML que, assim como AFTER, pode ser configurado para executar por linha ou por instrução. Logo, não se limita ao nível de instrução.
PEGA ESSA DICA!
No PostgreSQL, escreva sempre os gatilhos associados a eventos DDL (TRUNCATE, CREATE, ALTER, DROP) como FOR EACH STATEMENT. Já eventos DML (INSERT, UPDATE, DELETE) aceitam ambos os níveis; escolha FOR EACH ROW quando precisar acessar dados da linha modificada. Os gatilhos INSTEAD OF são naturalmente row-level e aplicados a views.