### **Motivação para o Uso de Triggers**
Os **triggers** são mecanismos que permitem executar ações automaticamente em
resposta a eventos como **inserções**, **atualizações** ou **deleções** em tabelas.
No contexto do projeto, os triggers garantem:
- **Integridade dos Dados:** Evitar valores inválidos ou inconsistentes.
- **Automação de Processos:** Capturar alterações ou realizar ações sem intervenção
manual.
- **Auditoria:** Rastrear mudanças importantes no banco de dados.
---
### **a) Trigger para Verificar Preço de Arma**
```sql
CREATE OR REPLACE FUNCTION verificar_preco_arma()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
IF NEW.Preco < 0 THEN
RAISE EXCEPTION 'O preço da arma não pode ser negativo.';
END IF;
RETURN NEW;
END;
$$;
CREATE TRIGGER trigger_verificar_preco_arma
BEFORE INSERT OR UPDATE ON Arma
FOR EACH ROW
EXECUTE FUNCTION verificar_preco_arma();
```
#### **Objetivo:**
- Evitar que armas sejam cadastradas ou atualizadas com valores de preço negativos.
#### **Funcionamento:**
1. Antes de **inserir** ou **atualizar** uma arma, o trigger verifica o valor do
campo `Preco`.
2. Caso o preço seja negativo, a operação é cancelada e uma exceção é levantada.
#### **Benefício:**
- **Integridade dos Dados:** Garante que o banco de dados nunca conterá informações
inválidas (preço negativo para armas).
- **Automação:** Elimina a necessidade de validações adicionais no lado da
aplicação.
---
### **b) Trigger para Log de Atualização de Ranking**
```sql
CREATE OR REPLACE FUNCTION log_atualizacao_ranking()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
INSERT INTO Log_Ranking (ID_Jogador, Ranking_Antigo, Ranking_Novo,
Data_Atualizacao)
VALUES (OLD.ID_Jogador, OLD.Ranking, NEW.Ranking, NOW());
RETURN NEW;
END;
$$;
CREATE TRIGGER trigger_log_ranking
AFTER UPDATE OF Ranking ON Jogador
FOR EACH ROW
EXECUTE FUNCTION log_atualizacao_ranking();
```
#### **Objetivo:**
- Registrar todas as alterações no ranking de um jogador para fins de auditoria e
análise.
#### **Funcionamento:**
1. Sempre que o campo `Ranking` de um jogador for atualizado, o trigger é acionado.
2. Insere-se um registro na tabela `Log_Ranking` contendo:
- ID do jogador.
- Ranking antigo (`OLD.Ranking`).
- Novo ranking (`NEW.Ranking`).
- Data e hora da atualização (`NOW()`).
#### **Benefício:**
- **Auditoria:** Cria um histórico detalhado de todas as alterações de ranking,
facilitando análises e investigações futuras.
- **Transparência:** Fornece um registro confiável para identificar quando e por
quem alterações foram realizadas.
---
### **Por que criar Triggers no Projeto?**
1. **Validação Automática:**
- Triggers como o de preço de arma evitam erros antes mesmo que os dados sejam
inseridos no banco, garantindo maior confiabilidade.
2. **Histórico de Alterações:**
- Triggers como o de log de ranking ajudam a criar registros detalhados que
podem ser usados para auditoria e relatórios.
3. **Redução de Código na Aplicação:**
- Lógica que seria implementada no código do sistema é movida para o banco de
dados, promovendo centralização e menor risco de inconsistências.
4. **Ações em Tempo Real:**
- A execução automática de funções evita atrasos, garantindo que alterações
importantes sejam registradas no momento em que ocorrem.
---
Esses triggers desempenham um papel essencial na manutenção da integridade e
rastreabilidade do banco de dados, promovendo maior confiabilidade no gerenciamento
de dados relacionados ao jogo **Valorant**.