Skip to content

Triggers

No contexto de bancos de dados, triggers são procedimentos armazenados que são automaticamente executados (ou "disparados") em resposta a determinados eventos em uma tabela, como inserções, atualizações ou exclusões de registros. Eles são utilizados para garantir a integridade dos dados, aplicar regras de negócio automaticamente e evitar inconsistências.

No nosso projeto, utilizamos triggers para automatizar e reforçar algumas regras fundamentais do jogo, como:

  • Atualização do status do personagem após um combate, garantindo que seu estado seja ajustado conforme o resultado.
  • Verificação da capacidade do inventário, impedindo que um personagem carregue mais itens do que o permitido.
  • Validação do tipo de NPC, assegurando que cada personagem não-jogador tenha a classificação correta conforme sua função no jogo.
  • Gerenciamento do respawn de inimigos, controlando o reaparecimento de adversários no mundo do jogo.
  • Validação de personagens e especializações, evitando que personagens sejam criados ou atualizados com informações inconsistentes.
  • Essas triggers desempenham um papel essencial na manutenção da lógica do jogo e na garantia da consistência dos dados, proporcionando uma experiência mais estruturada e fluida para os jogadores.

1. Trigger: trigger_atualizar_status_combate_pc

Descrição: Atualiza o status de combate do PC com base no resultado do combate registrado na tabela Combate.

Trigger:

CREATE TRIGGER trigger_atualizar_status_combate_pc
AFTER INSERT ON Combate
FOR EACH ROW
EXECUTE FUNCTION atualizar_status_combate_pc();

Função Associada:

CREATE OR REPLACE FUNCTION atualizar_status_combate_pc()
RETURNS TRIGGER AS $$
BEGIN
    IF NEW.resultado = 'derrotado' THEN
        UPDATE PC
        SET combat_status = 'Envenenado'
        WHERE id_personagem = NEW.id_pc;
    ELSIF NEW.resultado = 'venceu' THEN
        UPDATE PC
        SET combat_status = 'Normal'
        WHERE id_personagem = NEW.id_pc;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

2. Trigger: trigger_verificar_capacidade_inventario

Descrição: Garante que a capacidade máxima do inventário de um personagem não seja excedida ao adicionar um novo item.

Trigger:

CREATE TRIGGER trigger_verificar_capacidade_inventario
BEFORE INSERT ON Inventario
FOR EACH ROW
EXECUTE FUNCTION verificar_capacidade_inventario();

Função Associada:

CREATE OR REPLACE FUNCTION verificar_capacidade_inventario()
RETURNS TRIGGER AS $$
DECLARE
    capacidade_maxima INT := 10;
    quantidade_itens INT;
BEGIN
    SELECT COUNT(*) INTO quantidade_itens
    FROM Inventario
    WHERE id_inventario = NEW.id_inventario;

    IF quantidade_itens >= capacidade_maxima THEN
        RAISE EXCEPTION 'Capacidade do inventário excedida.';
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

3. Trigger: trigger_valida_tipo_npc_*

Descrição: Valida o tipo de NPC ao inserir ou atualizar registros nas tabelas Mercador, Contratante, Inimigo e Chefe.

Triggers:

CREATE TRIGGER trigger_valida_tipo_npc_mercador
BEFORE INSERT OR UPDATE ON Mercador
FOR EACH ROW
EXECUTE FUNCTION valida_tipo_npc();

CREATE TRIGGER trigger_valida_tipo_npc_contratante
BEFORE INSERT OR UPDATE ON Contratante
FOR EACH ROW
EXECUTE FUNCTION valida_tipo_npc();

CREATE TRIGGER trigger_valida_tipo_npc_inimigo
BEFORE INSERT OR UPDATE ON Inimigo
FOR EACH ROW
EXECUTE FUNCTION valida_tipo_npc();

CREATE TRIGGER trigger_valida_tipo_npc_chefe
BEFORE INSERT OR UPDATE ON Chefe
FOR EACH ROW
EXECUTE FUNCTION valida_tipo_npc();

Função Associada:

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 = 'Contratante' AND NEW.tipo != 'Contratante') THEN
        RAISE EXCEPTION 'O tipo de NPC deve ser Contratante para a tabela Contratante';
    ELSIF (TG_TABLE_NAME = 'Inimigo' AND NEW.tipo != 'Inimigo') THEN
        RAISE EXCEPTION 'O tipo de NPC deve ser Inimigo para a tabela Inimigo';
    ELSIF (TG_TABLE_NAME = 'Chefe' AND NEW.tipo != 'Chefe') THEN
        RAISE EXCEPTION 'O tipo de NPC deve ser Chefe para a tabela Chefe';
    END IF;

    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

4. Trigger: trigger_respawn_inimigo

Descrição: Ativa a função de respawn de inimigos após sua remoção da tabela InstanciaInimigo.

Trigger:

CREATE OR REPLACE TRIGGER trigger_respawn_inimigo
AFTER DELETE ON InstanciaInimigo
FOR EACH ROW
EXECUTE FUNCTION respawn_inimigo();

5. Trigger: trigger_validar_personagem

Descrição: Valida as regras gerais de criação e atualização de personagens na tabela Personagem.

Trigger:

CREATE TRIGGER trigger_validar_personagem
BEFORE INSERT OR UPDATE ON Personagem
FOR EACH ROW
EXECUTE FUNCTION validar_personagem();

6. Trigger: trigger_validar_pc e trigger_validar_npc

Descrição: Garante que os personagens PC e NPC sigam suas regras de especialização.

Triggers: ```sql CREATE TRIGGER trigger_validar_pc BEFORE INSERT OR UPDATE ON PC FOR EACH ROW EXECUTE FUNCTION validar_especializacao_personagem();

CREATE TRIGGER trigger_validar_npc BEFORE INSERT OR UPDATE ON NPC FOR EACH ROW EXECUTE FUNCTION validar_especializacao_personagem();