Questão nº 41

Questão de Banco de Dados · FCC TRE-PR 2017 (nº 41)

FCC2017Analista Judiciário - Área Apoio Especializado - Especialidade Análise de SistemasBanco de Dados
Gabarito: Ever comentário ↓

Considere a existência de um procedure escrito em PL/SQL denominado verifica_votacao, que aceita dois parâmetros: um para a string do ID do candidato e outro para o número de votos obtidos em uma eleição.

```sql
CREATE OR REPLACE PROCEDURE verifica_votacao(id_do_cand NUMBER, num_vot_cand NUMBER) IS
/ implementação do restante do procedure /
```

Um DBA Oracle criou um trigger verifica_votacao_trg na tabela candidatos que é acionado antes de uma operação INSERT ou UPDATE. Em cada linha o trigger deve chamar o procedure verifica_votacao para executar a lógica de negócios e deve especificar o novo ID de candidato e o novo número de votos para os parâmetros do procedure.

```sql
CREATE OR REPLACE TRIGGER verifica_votacao_trg
......
```

I

```sql
INSERT OR UPDATE OF id_cand, num_vot
ON candidatos
FOR EACH ROW
BEGIN
verifica_votacao(......
```

II

```sql
);
END;
/
SHOW ERRORS
```

As lacunas I e II devem ser preenchidas, correta e respectivamente, por

Resposta comentada

Gabarito Alternativa E

Um trigger (gatilho) em PL/SQL é um bloco de código que é executado automaticamente em resposta a um evento, como uma operação `INSERT`, `UPDATE` ou `DELETE` em uma tabela. Ele pode ser executado `BEFORE` (antes) ou `AFTER` (depois) do evento, e pode ser de nível de instrução ou de nível de linha (`FOR EACH ROW`), onde podemos acessar os valores da linha antes da mudança com `:old.coluna` e depois da mudança com `:new.coluna`.

(A) Incorreta: `INSTEAD OF` é usado principalmente com views para substituir a operação DML, não é o tipo de trigger usual para validar dados antes de um `INSERT` ou `UPDATE` em uma tabela base. Além disso, `id_cand, num_vot` não é a sintaxe correta para referenciar os novos valores de uma linha em um trigger.
(B) Incorreta: `INSTEAD OF` está incorreto pelo mesmo motivo da alternativa A. `new.id_cand, new.num_vot` está sintaticamente incorreto para referenciar os pseudo-registros em um trigger; falta o prefixo de dois pontos (`:`).
(C) Incorreta: `PRIOR` não é uma palavra-chave válida para especificar o tempo de disparo de um trigger em Oracle PL/SQL. As opções são `BEFORE` ou `AFTER`.
(D) Incorreta: A palavra-chave `BEFORE` está correta para o timing do trigger, pois a lógica de negócios precisa ser executada antes da operação DML. No entanto, a forma `new id_cand, new num_vot` está sintaticamente incorreta para referenciar os novos valores das colunas. É obrigatório usar o prefixo de dois pontos (`:`) para os pseudo-registros `:new` e `:old`. Esta é a armadilha da banca, pois `BEFORE` é o timing correto, mas a sintaxe para referenciar os valores está errada.
(E) Correta: A palavra-chave `BEFORE` está correta, pois o trigger deve ser acionado antes da operação `INSERT` ou `UPDATE` para que a validação possa ocorrer e, se necessário, impedir a operação ou modificar os dados. A sintaxe `:new.id_cand, :new.num_vot` está correta para acessar os valores que a linha terá após a operação DML, que são os valores que o `procedure verifica_votacao` precisa para sua lógica.

Fonte: FCC TRE-PR 2017 Analista Judiciário - Área Apoio Especializado - Especialidade Análise de Sistemas (Caderno Tipo 1). Reproduzida para fins de estudo.

Continue estudando

Estudar é izi

Pratique milhares de questões como esta, de graça, com explicação e gamificação no Quizinho.

Estudar de graça no Quizinho