Questão nº 33
Questão de Tecnologia da Informação · CESGRANRIO BASA 02/2021 (nº 33)
Em banco de dados, os gatilhos são utilizados, entre ou-
tros objetivos, para implementar restrições de integridade.
Considere que em um banco de dados de um banco co-
mercial há duas tabelas, `CLIENTE` (chave primária `CPF`)
e `SERVICO` (chave primária composta por `CPF` e identifi-
cação do serviço), e há a restrição de que um cliente não
pode estar associado a mais de cinco serviços.
Que definição deve ser utilizada para implementar essa
restrição por meio de um gatilho?
- A`BEFORE INSERT ON CLIENTE`
- B`AFTER INSERT ON CLIENTE`
- C`BEFORE INSERT ON SERVICO` (alternativa correta)
- D`AFTER INSERT ON SERVICO`
- E`WHEN CLIENTE INSERT ON SERVICO`
Resposta comentada
Gabarito Alternativa C
Conceito-chave: Gatilho (trigger) é um bloco de código que o banco executa automaticamente antes ou depois de um comando INSERT, UPDATE ou DELETE. Para impedir uma violação de regra, o gatilho deve rodar antes da inserção do dado que pode causar o problema — nesse caso, antes de inserir um novo serviço, pois é aí que se conta quantos o cliente já tem.
- (A) Incorreta:
BEFORE INSERT ON CLIENTEdispara quando um cliente é criado, mas a restrição é sobre a associação a serviços, não sobre a existência do cliente — e nesse momento ainda não há serviços vinculados. - (B) Incorreta:
AFTER INSERT ON CLIENTEtambém não ajuda, pois o problema só aparece quando um serviço é adicionado, e não quando o cliente é cadastrado. - (C) Correta:
BEFORE INSERT ON SERVICOé o gabarito: antes de inserir um novo serviço, o gatilho conta quantos serviços aqueleCPFjá tem na tabelaSERVICO; se já houver 5, ele aborta a inserção (ex.:RAISE EXCEPTION). Isso impede a violação na origem. - (D) Incorreta:
AFTER INSERT ON SERVICOjá deixaria o dado gravado; seria preciso fazer umROLLBACKou deletar o registro, o que é mais frágil e ineficiente — a validação deve ser preventiva, não corretiva. - (E) Incorreta:
WHEN CLIENTE INSERT ON SERVICOnão é sintaxe válida de gatilho em SQL padrão; não existe essa cláusula para disparar eventos entre tabelas diferentes.
Armadilha do distrator mais tentador (D): A banca quer que você pense que "depois de inserir, eu verifico e apago se passar de 5". Isso até funcionaria, mas é ruim: o dado já foi gravado, gerando trabalho extra e risco de inconsistência temporária. A pegadinha é que o comando BEFORE é semanticamente mais correto para restrições de integridade, pois bloqueia a operação antes que o erro aconteça.
Fonte: CESGRANRIO BASA 02/2021 Técnico Científico - Tecnologia da Informação. Reproduzida para fins de estudo.