Trigger
Introdução
Um Trigger é um procedimento especial armazenado no banco de dados, ativado automaticamente em resposta a eventos específicos, como inserções, atualizações ou deleções de registros em uma tabela. Eles são úteis para garantir a integridade dos dados e a aplicação de regras de negócio diretamente no banco. Por exemplo, um trigger pode ser utilizado para verificar se um valor inserido em uma coluna atende a certos critérios ou para atualizar automaticamente outras tabelas quando uma alteração ocorre. Essa automação facilita a manutenção de consistência, reduzindo erros manuais e otimizando processos repetitivos.
Consulta de Dados
CREATE OR REPLACE FUNCTION atualizar_afinidade_jogador()
RETURNS TRIGGER AS $$
BEGIN
UPDATE Afinidade
SET qtd_atual = qtd_atual + 1
WHERE id_afinidade = NEW.afinidade;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_atualizar_afinidade_jogador
AFTER INSERT ON Jogador
FOR EACH ROW
EXECUTE FUNCTION atualizar_afinidade_jogador();
CREATE OR REPLACE FUNCTION verificar_capacidade_bau()
RETURNS TRIGGER AS $$
BEGIN
IF (SELECT COUNT(*) FROM Bau WHERE sala = NEW.sala) >= (SELECT capacidade FROM Bau WHERE id_bau = NEW.id_bau) THEN
RAISE EXCEPTION 'Capacidade do baú excedida.';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_verificar_capacidade_bau
BEFORE INSERT ON Bau
FOR EACH ROW
EXECUTE FUNCTION verificar_capacidade_bau();
CREATE OR REPLACE FUNCTION valida_e_insere_item()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO Instancia_Item(item)
VALUES (NEW.id_instancia);
IF TG_TABLE_NAME = 'Consumivel' THEN
INSERT INTO Instancia_Item(item)
VALUES (NEW.id_instancia);
ELSIF TG_TABLE_NAME = 'Defesa' THEN
INSERT INTO Instancia_Item(item)
VALUES (NEW.id_instancia);
ELSIF TG_TABLE_NAME = 'Ataque' THEN
INSERT INTO Instancia_Item(item)
VALUES (NEW.id_instancia);
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trigger_valida_e_insere_item_consumivel
AFTER INSERT OR UPDATE ON Consumivel
FOR EACH ROW
EXECUTE FUNCTION valida_e_insere_item();
CREATE TRIGGER trigger_valida_e_insere_item_defesa
AFTER INSERT OR UPDATE ON Defesa
FOR EACH ROW
EXECUTE FUNCTION valida_e_insere_item();
CREATE TRIGGER trigger_valida_e_insere_item_ataque
AFTER INSERT OR UPDATE ON Ataque
FOR EACH ROW
EXECUTE FUNCTION valida_e_insere_item();
CREATE OR REPLACE FUNCTION valida_tipo_npc()
RETURNS TRIGGER AS $$
BEGIN
IF (TG_TABLE_NAME = 'Mercador' AND NEW.tipo != 'Mercador') THEN
RAISE EXCEPTION 'O tipo de NPC deve ser Mercador para a tabela Mercador';
ELSIF (TG_TABLE_NAME = 'Aliado' AND NEW.tipo != 'Aliado') THEN
RAISE EXCEPTION 'O tipo de NPC deve ser Aliado para a tabela Aliado';
ELSIF (TG_TABLE_NAME = 'Monstro' AND NEW.tipo != 'Monstro') THEN
RAISE EXCEPTION 'O tipo de NPC deve ser Monstro para a tabela Monstro';
END IF;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
Histórico de Versão
Versão | Data | Descrição | Autor(es) |
---|---|---|---|
1.0 |
08/09/2024 | Criação do documento | Marcos Castilhos e Bianca Castro |