Pular para o conteúdo principal

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

Banco de DadosSQL
Código
fg098194
Banca
FGV
Órgão
TJ-AP
Ano
2024
Nível
Superior
Cargo
Apoio Especializado - Tecnologia da Informação - Desenvolvimento de Sistemas
Considere um esquema relacional criado com o seguinte script SQL.Imagem associada para resolução da questãoPara evitar a introdução de erros de integridade na tabela E2 decorrentes da remoção de registros da tabela E1, a cláusula complementar na definição da chave estrangeira seria:
  1. Ano action;
  2. Bon delete cascade;
  3. Con delete raiserror;
  4. Don delete restrict;
  5. Eset null.
Revelar gabarito e comentário

GabaritoB — on delete cascade;

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

Integridade referencial: ações de exclusão em chaves estrangeiras

Gabarito: letra B. Para evitar erros de integridade na tabela E2 quando um registro de E1 é removido, a cláusula correta é ON DELETE CASCADE, que propaga a exclusão: ao apagar o registro-pai, os registros-filhos que referenciam aquela chave também são apagados automaticamente. Essa é a ação que garante que não fiquem referências órfãs na tabela filha.

A integridade referencial é a regra que garante que um valor de chave estrangeira em uma tabela sempre corresponda a um valor de chave primária (ou candidata) existente em outra tabela. Quando você tenta excluir um registro da tabela-pai (E1) que ainda é referenciado por registros da tabela-filha (E2), o banco precisa decidir o que fazer — e é exatamente isso que as cláusulas complementares da FOREIGN KEY controlam. Sem nenhuma ação definida, o banco aplica o comportamento padrão, que é o NO ACTION (ou RESTRICT, dependendo do SGBD): a exclusão é simplesmente bloqueada, gerando um erro de violação de integridade referencial.

O ON DELETE CASCADE resolve esse impasse de forma automática: em vez de bloquear a exclusão, ele a propaga. Se E1 é a tabela de países e E2 a de estados, excluir um país faz com que todos os seus estados sejam excluídos junto. É a solução mais comum quando o relacionamento é de dependência existencial — o registro filho só faz sentido se o pai existir. O ON DELETE SET NULL é a alternativa para relacionamentos opcionais: ao excluir o pai, a coluna da chave estrangeira nos filhos é preenchida com NULL, preservando os registros filhos, mas desvinculando-os. Já o RESTRICT e o NO ACTION são variações do mesmo princípio de bloqueio — a diferença entre eles é sutil e depende do momento em que a verificação ocorre dentro da transação.

A pegadinha desta questão está em reconhecer que o objetivo declarado é "evitar a introdução de erros de integridade" — ou seja, o banco deve impedir que fiquem registros órfãos. Tanto o CASCADE quanto o SET NULL e o RESTRICT evitam o erro, mas cada um com uma estratégia diferente. A alternativa C (on delete raiserror) nem sequer existe na sintaxe SQL padrão — é um termo do Transact-SQL do SQL Server usado em triggers, não em definição de chave estrangeira. A banca explora exatamente essa confusão entre os mecanismos de bloqueio e os de propagação.

Guarde a distinção central: bloquear (NO ACTION/RESTRICT) impede a exclusão do pai; propagar (CASCADE) exclui os filhos junto; desvincular (SET NULL) mantém os filhos, mas anula a referência. É nessa tríade que as alternativas se dividem.

Critério

NO ACTION / RESTRICT (A/D)

ON DELETE CASCADE (B)

ON DELETE SET NULL (E)

Efeito na exclusão do pai

Bloqueia a exclusão se houver filhos

Exclui os filhos junto com o pai

Mantém os filhos, mas anula a FK

Resultado nos registros-filhos

Nenhuma alteração (exclusão não ocorre)

Registros filhos são removidos

FK fica com valor NULL

Requisito na coluna FK

Nenhum requisito especial

Nenhum requisito especial

Coluna deve aceitar NULL

Uso típico

Relacionamento obrigatório, sem propagação

Dependência existencial (filho só existe com o pai)

Relacionamento opcional

Evita erro de integridade?

Sim, por bloqueio

Sim, por propagação

Sim, por desvinculação

Alternativa A — ❌ Incorreta

NO ACTION é o comportamento padrão: a exclusão do registro-pai é bloqueada se houver registros filhos referenciando-o. Isso evita o erro de integridade, mas não é o que a questão pede — o enunciado fala em "evitar a introdução de erros" de forma genérica, e a banca quer a ação que propaga a exclusão, não a que a impede. A pegadinha: NO ACTION evita o erro, mas por bloqueio, não por propagação.

Alternativa B — ✅ Correta ⟵ GABARITO

ON DELETE CASCADE propaga a exclusão: ao remover um registro de E1, todos os registros de E2 cuja chave estrangeira referencia aquele registro são removidos automaticamente. Isso elimina a possibilidade de referências órfãs e, portanto, evita erros de integridade referencial. É a ação mais comum para relacionamentos de dependência existencial (1:N obrigatória).

Alternativa C — ❌ Incorreta

ON DELETE RAISERROR não existe na sintaxe SQL padrão para definição de chaves estrangeiras. RAISERROR é um comando do Transact-SQL (SQL Server) usado para gerar mensagens de erro em blocos de programação, não uma ação de integridade referencial. A banca mistura conceitos de linguagens diferentes para confundir.

Alternativa D — ❌ Incorreta

ON DELETE RESTRICT bloqueia a exclusão do registro-pai se houver filhos referenciando-o, gerando um erro de violação. Assim como o NO ACTION, ele impede a exclusão em vez de propagá-la. A diferença entre RESTRICT e NO ACTION é sutil (o RESTRICT verifica imediatamente; o NO ACTION pode adiar a verificação até o fim da transação em alguns SGBDs), mas ambos são ações de bloqueio, não de propagação.

Alternativa E — ❌ Incorreta

ON DELETE SET NULL desvincula os registros filhos: ao excluir o pai, a coluna da chave estrangeira nos filhos é preenchida com NULL. Isso preserva os registros filhos, mas exige que a coluna da chave estrangeira seja anulável (não definida como NOT NULL). É adequado para relacionamentos opcionais, mas não é o que a questão pede — o objetivo é evitar erros de integridade, e o SET NULL só funciona se a coluna aceitar NULL; além disso, a banca quer a propagação da exclusão, não a anulação.

Gabarito: letra BON DELETE CASCADE é a cláusula que propaga a exclusão do registro-pai para os registros-filhos, evitando referências órfãs e, consequentemente, erros de integridade referencial.

Link permanente: /questoes/fg098194