Pular para conteúdo

Versão 1.0

Triggers

O que são Triggers?

Triggers são blocos de código executados automaticamente pelo banco de dados em resposta a determinados eventos, como inserções, atualizações ou remoções de dados em tabelas. Eles são utilizados para garantir regras de negócio, integridade dos dados e automatizar processos que devem ocorrer de forma transparente para o usuário.


Triggers e Funções

Trigger: trigger_aplicar_juros_dia
CREATE OR REPLACE FUNCTION aplicar_juros_ao_mudar_dia()
RETURNS TRIGGER AS $$
DECLARE
    dias_passados INTEGER;
    juros_calculados INTEGER;
    taxa_juros DECIMAL(5,2) := 2.50; -- 2.5% ao dia
BEGIN
    IF OLD."dia" != NEW."dia" THEN
        dias_passados := NEW."dia" - OLD."dia";
        UPDATE "inst_banco" 
        SET "valorAtual" = "valorAtual" + FLOOR("valorAtual" * (taxa_juros / 100.0) * dias_passados)
        WHERE "seedMundo" = NEW."seedMundo";
        RAISE NOTICE 'Juros aplicados no mundo %: % dias passaram', NEW."seedMundo", dias_passados;
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_aplicar_juros_dia
    AFTER UPDATE ON "mundo"
    FOR EACH ROW
    EXECUTE FUNCTION aplicar_juros_ao_mudar_dia();
Trigger: trigger_validar_armadura_unica
CREATE OR REPLACE FUNCTION validar_armadura_especializacao_unica()
RETURNS TRIGGER AS $$
BEGIN
    IF EXISTS (SELECT 1 FROM "arma" WHERE "idItem" = NEW."idItem") THEN
        RAISE EXCEPTION 'Item ID % já está classificado como Arma. Um item não pode ter múltiplas especializações.', NEW."idItem";
    END IF;
    IF EXISTS (SELECT 1 FROM "pocao" WHERE "idItem" = NEW."idItem") THEN
        RAISE EXCEPTION 'Item ID % já está classificado como Poção. Um item não pode ter múltiplas especializações.', NEW."idItem";
    END IF;
    UPDATE "item" SET "tipo" = 'Armadura' WHERE "idItem" = NEW."idItem";
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_validar_armadura_unica
    BEFORE INSERT ON "armadura"
    FOR EACH ROW
    EXECUTE FUNCTION validar_armadura_especializacao_unica();
Trigger: trigger_validar_pocao_unica
CREATE OR REPLACE FUNCTION validar_pocao_especializacao_unica()
RETURNS TRIGGER AS $$
BEGIN
    IF EXISTS (SELECT 1 FROM "arma" WHERE "idItem" = NEW."idItem") THEN
        RAISE EXCEPTION 'Item ID % já está classificado como Arma. Um item não pode ter múltiplas especializações.', NEW."idItem";
    END IF;
    IF EXISTS (SELECT 1 FROM "armadura" WHERE "idItem" = NEW."idItem") THEN
        RAISE EXCEPTION 'Item ID % já está classificado como Armadura. Um item não pode ter múltiplas especializações.', NEW."idItem";
    END IF;
    UPDATE "item" SET "tipo" = 'Consumível' WHERE "idItem" = NEW."idItem";
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_validar_pocao_unica
    BEFORE INSERT ON "pocao"
    FOR EACH ROW
    EXECUTE FUNCTION validar_pocao_especializacao_unica();
Trigger: trigger_validar_arma_unica
CREATE OR REPLACE FUNCTION validar_arma_especializacao_unica()
RETURNS TRIGGER AS $$
BEGIN
    IF EXISTS (SELECT 1 FROM "armadura" WHERE "idItem" = NEW."idItem") THEN
        RAISE EXCEPTION 'Item ID % já está classificado como Armadura. Um item não pode ter múltiplas especializações.', NEW."idItem";
    END IF;
    IF EXISTS (SELECT 1 FROM "pocao" WHERE "idItem" = NEW."idItem") THEN
        RAISE EXCEPTION 'Item ID % já está classificado como Poção. Um item não pode ter múltiplas especializações.', NEW."idItem";
    END IF;
    UPDATE "item" SET "tipo" = 'Arma' WHERE "idItem" = NEW."idItem";
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_validar_arma_unica
    BEFORE INSERT ON "arma"
    FOR EACH ROW
    EXECUTE FUNCTION validar_arma_especializacao_unica();
Trigger: trigger_validar_estabelecimento_unico
CREATE OR REPLACE FUNCTION validar_estabelecimento_especializacao_unica()
RETURNS TRIGGER AS $$
BEGIN
    IF EXISTS (SELECT 1 FROM "masmorra" WHERE "idLocal" = NEW."idLocal") THEN
        RAISE EXCEPTION 'Local ID % já está classificado como Masmorra. Um local não pode ter múltiplas especializações.', NEW."idLocal";
    END IF;
    UPDATE "local" SET "tipo" = 'Estabelecimento' WHERE "idLocal" = NEW."idLocal";
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_validar_estabelecimento_unico
    BEFORE INSERT ON "estabelecimento"
    FOR EACH ROW
    EXECUTE FUNCTION validar_estabelecimento_especializacao_unica();
Trigger: trigger_validar_masmorra_unica
CREATE OR REPLACE FUNCTION validar_masmorra_especializacao_unica()
RETURNS TRIGGER AS $$
BEGIN
    IF EXISTS (SELECT 1 FROM "estabelecimento" WHERE "idLocal" = NEW."idLocal") THEN
        RAISE EXCEPTION 'Local ID % já está classificado como Estabelecimento. Um local não pode ter múltiplas especializações.', NEW."idLocal";
    END IF;
    UPDATE "local" SET "tipo" = 'Masmorra' WHERE "idLocal" = NEW."idLocal";
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_validar_masmorra_unica
    BEFORE INSERT ON "masmorra"
    FOR EACH ROW
    EXECUTE FUNCTION validar_masmorra_especializacao_unica();
Trigger: trigger_remover_especializacoes_item
CREATE OR REPLACE FUNCTION remover_especializacoes_item()
RETURNS TRIGGER AS $$
BEGIN
    -- Remove o item de todas as tabelas especializadas
    DELETE FROM "arma" WHERE "idItem" = OLD."idItem";
    DELETE FROM "armadura" WHERE "idItem" = OLD."idItem";
    DELETE FROM "pocao" WHERE "idItem" = OLD."idItem";
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_remover_especializacoes_item
    BEFORE DELETE ON "item"
    FOR EACH ROW
    EXECUTE FUNCTION remover_especializacoes_item();
Trigger: trigger_remover_especializacoes_local
CREATE OR REPLACE FUNCTION remover_especializacoes_local()
RETURNS TRIGGER AS $$
BEGIN
    -- Remove o local de todas as tabelas especializadas
    DELETE FROM "estabelecimento" WHERE "idLocal" = OLD."idLocal";
    DELETE FROM "masmorra" WHERE "idLocal" = OLD."idLocal";
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_remover_especializacoes_local
    BEFORE DELETE ON "local"
    FOR EACH ROW
    EXECUTE FUNCTION remover_especializacoes_local();
Trigger: trigger_atualizar_tipo_apos_remover_arma
CREATE OR REPLACE FUNCTION atualizar_tipo_apos_remover_arma()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM "arma" WHERE "idItem" = OLD."idItem") THEN
        UPDATE "item" SET "tipo" = NULL WHERE "idItem" = OLD."idItem";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_tipo_apos_remover_arma
    AFTER DELETE ON "arma"
    FOR EACH ROW
    EXECUTE FUNCTION atualizar_tipo_apos_remover_arma();
Trigger: trigger_atualizar_tipo_apos_remover_armadura
CREATE OR REPLACE FUNCTION atualizar_tipo_apos_remover_armadura()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM "armadura" WHERE "idItem" = OLD."idItem") THEN
        UPDATE "item" SET "tipo" = NULL WHERE "idItem" = OLD."idItem";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_tipo_apos_remover_armadura
    AFTER DELETE ON "armadura"
    FOR EACH ROW
    EXECUTE FUNCTION atualizar_tipo_apos_remover_armadura();
Trigger: trigger_atualizar_tipo_apos_remover_pocao
CREATE OR REPLACE FUNCTION atualizar_tipo_apos_remover_pocao()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM "pocao" WHERE "idItem" = OLD."idItem") THEN
        UPDATE "item" SET "tipo" = NULL WHERE "idItem" = OLD."idItem";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_tipo_apos_remover_pocao
    AFTER DELETE ON "pocao"
    FOR EACH ROW
    EXECUTE FUNCTION atualizar_tipo_apos_remover_pocao();
Trigger: trigger_atualizar_tipo_apos_remover_estabelecimento
CREATE OR REPLACE FUNCTION atualizar_tipo_apos_remover_estabelecimento()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM "estabelecimento" WHERE "idLocal" = OLD."idLocal") THEN
        UPDATE "local" SET "tipo" = NULL WHERE "idLocal" = OLD."idLocal";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_tipo_apos_remover_estabelecimento
    AFTER DELETE ON "estabelecimento"
    FOR EACH ROW
    EXECUTE FUNCTION atualizar_tipo_apos_remover_estabelecimento();
Trigger: trigger_atualizar_tipo_apos_remover_masmorra
CREATE OR REPLACE FUNCTION atualizar_tipo_apos_remover_masmorra()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (SELECT 1 FROM "masmorra" WHERE "idLocal" = OLD."idLocal") THEN
        UPDATE "local" SET "tipo" = NULL WHERE "idLocal" = OLD."idLocal";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trigger_atualizar_tipo_apos_remover_masmorra
    AFTER DELETE ON "masmorra"
    FOR EACH ROW
    EXECUTE FUNCTION atualizar_tipo_apos_remover_masmorra();
Trigger: trig_validar_arma, trig_validar_armadura, trig_validar_pocao
CREATE OR REPLACE FUNCTION validar_especializacao_item()
RETURNS TRIGGER AS $$
BEGIN
    -- Verificar se item já existe em outra especialização
    IF TG_TABLE_NAME = 'arma' THEN
        IF EXISTS (SELECT 1 FROM "armadura" WHERE "idItem" = NEW."idItem") THEN
            RAISE EXCEPTION 'Item ID % já classificado como Armadura. Não pode ser salvo como Arma.', NEW."idItem";
        END IF;
        IF EXISTS (SELECT 1 FROM "pocao" WHERE "idItem" = NEW."idItem") THEN
            RAISE EXCEPTION 'Item ID % já classificado como Poção. Não pode ser salvo como Arma.', NEW."idItem";
        END IF;
        UPDATE "item" SET "tipo" = 'Arma' WHERE "idItem" = NEW."idItem";
    ELSIF TG_TABLE_NAME = 'armadura' THEN
        IF EXISTS (SELECT 1 FROM "arma" WHERE "idItem" = NEW."idItem") THEN
            RAISE EXCEPTION 'Item ID % já classificado como Arma. Não pode ser salvo como Armadura.', NEW."idItem";
        END IF;
        IF EXISTS (SELECT 1 FROM "pocao" WHERE "idItem" = NEW."idItem") THEN
            RAISE EXCEPTION 'Item ID % já classificado como Poção. Não pode ser salvo como Armadura.', NEW."idItem";
        END IF;
        UPDATE "item" SET "tipo" = 'Armadura' WHERE "idItem" = NEW."idItem";
    ELSIF TG_TABLE_NAME = 'pocao' THEN
        IF EXISTS (SELECT 1 FROM "arma" WHERE "idItem" = NEW."idItem") THEN
            RAISE EXCEPTION 'Item ID % já classificado como Arma. Não pode ser salvo como Poção.', NEW."idItem";
        END IF;
        IF EXISTS (SELECT 1 FROM "armadura" WHERE "idItem" = NEW."idItem") THEN
            RAISE EXCEPTION 'Item ID % já classificado como Armadura. Não pode ser salvo como Poção.', NEW."idItem";
        END IF;
        UPDATE "item" SET "tipo" = 'Consumível' WHERE "idItem" = NEW."idItem";
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_validar_arma
    BEFORE INSERT ON "arma"
    FOR EACH ROW EXECUTE FUNCTION validar_especializacao_item();
CREATE TRIGGER trig_validar_armadura
    BEFORE INSERT ON "armadura"
    FOR EACH ROW EXECUTE FUNCTION validar_especializacao_item();
CREATE TRIGGER trig_validar_pocao
    BEFORE INSERT ON "pocao"
    FOR EACH ROW EXECUTE FUNCTION validar_especializacao_item();
Trigger: trig_validar_masmorra, trig_validar_estabelecimento
CREATE OR REPLACE FUNCTION validar_especializacao_local()
RETURNS TRIGGER AS $$
BEGIN
    IF TG_TABLE_NAME = 'masmorra' THEN
        IF EXISTS (SELECT 1 FROM "estabelecimento" WHERE "nomeLocal" = NEW."nomeLocal") THEN
            RAISE EXCEPTION 'Local % já classificado como Estabelecimento. Não pode ser salvo como Masmorra.', NEW."nomeLocal";
        END IF;
        UPDATE "local" SET "tipoLocal" = 'Masmorra' WHERE "nomeLocal" = NEW."nomeLocal";
    ELSIF TG_TABLE_NAME = 'estabelecimento' THEN
        IF EXISTS (SELECT 1 FROM "masmorra" WHERE "nomeLocal" = NEW."nomeLocal") THEN
            RAISE EXCEPTION 'Local % já classificado como Masmorra. Não pode ser salvo como Estabelecimento.', NEW."nomeLocal";
        END IF;
        UPDATE "local" SET "tipoLocal" = 'Estabelecimento' WHERE "nomeLocal" = NEW."nomeLocal";
    END IF;
    RETURN NEW;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_validar_masmorra
    BEFORE INSERT ON "masmorra"
    FOR EACH ROW EXECUTE FUNCTION validar_especializacao_local();
CREATE TRIGGER trig_validar_estabelecimento
    BEFORE INSERT ON "estabelecimento"
    FOR EACH ROW EXECUTE FUNCTION validar_especializacao_local();
Trigger: trig_atualizar_tipo_arma, trig_atualizar_tipo_armadura, trig_atualizar_tipo_pocao
CREATE OR REPLACE FUNCTION atualizar_tipo_item_apos_delete()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM "arma" WHERE "idItem" = OLD."idItem"
        UNION ALL
        SELECT 1 FROM "armadura" WHERE "idItem" = OLD."idItem"
        UNION ALL  
        SELECT 1 FROM "pocao" WHERE "idItem" = OLD."idItem"
    ) THEN
        UPDATE "item" SET "tipo" = NULL WHERE "idItem" = OLD."idItem";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_atualizar_tipo_arma
    AFTER DELETE ON "arma"
    FOR EACH ROW EXECUTE FUNCTION atualizar_tipo_item_apos_delete();
CREATE TRIGGER trig_atualizar_tipo_armadura
    AFTER DELETE ON "armadura"
    FOR EACH ROW EXECUTE FUNCTION atualizar_tipo_item_apos_delete();
CREATE TRIGGER trig_atualizar_tipo_pocao
    AFTER DELETE ON "pocao"
    FOR EACH ROW EXECUTE FUNCTION atualizar_tipo_item_apos_delete();
Trigger: trig_atualizar_tipo_masmorra, trig_atualizar_tipo_estabelecimento
CREATE OR REPLACE FUNCTION atualizar_tipo_local_apos_delete()
RETURNS TRIGGER AS $$
BEGIN
    IF NOT EXISTS (
        SELECT 1 FROM "masmorra" WHERE "nomeLocal" = OLD."nomeLocal"
        UNION ALL
        SELECT 1 FROM "estabelecimento" WHERE "nomeLocal" = OLD."nomeLocal"
    ) THEN
        UPDATE "local" SET "tipoLocal" = 'Local' WHERE "nomeLocal" = OLD."nomeLocal";
    END IF;
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_atualizar_tipo_masmorra
    AFTER DELETE ON "masmorra"
    FOR EACH ROW EXECUTE FUNCTION atualizar_tipo_local_apos_delete();
CREATE TRIGGER trig_atualizar_tipo_estabelecimento
    AFTER DELETE ON "estabelecimento"
    FOR EACH ROW EXECUTE FUNCTION atualizar_tipo_local_apos_delete();
Trigger: trig_deletar_item_especializacao, trig_deletar_local_especializacao
CREATE OR REPLACE FUNCTION deletar_especializacao_item()
RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM "arma" WHERE "idItem" = OLD."idItem";
    DELETE FROM "armadura" WHERE "idItem" = OLD."idItem";
    DELETE FROM "pocao" WHERE "idItem" = OLD."idItem";
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_deletar_item_especializacao
    BEFORE DELETE ON "item"
    FOR EACH ROW EXECUTE FUNCTION deletar_especializacao_item();

CREATE OR REPLACE FUNCTION deletar_especializacao_local()
RETURNS TRIGGER AS $$
BEGIN
    DELETE FROM "masmorra" WHERE "nomeLocal" = OLD."nomeLocal";
    DELETE FROM "estabelecimento" WHERE "nomeLocal" = OLD."nomeLocal";
    RETURN OLD;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER trig_deletar_local_especializacao
    BEFORE DELETE ON "local"
    FOR EACH ROW EXECUTE FUNCTION deletar_especializacao_local();

Data Versão Autor(es) Mudanças
06/07/2025 1.0 Todos da Equipe Criação da Página e Inserção Triggers