-- Exemplos de Gatilhos || Criação: 2025-1 | Revisão: 2025-2 -- ---------------------------------------------------------------------------------------------------------------------------------------- -- -- Esta série de arquivos demonstra o desenvolvimento de gatilhos. -- Desde a fase de percepção do problema, passando pelo desenolvimento do algoritmo e implementação em PL/PGSQL do PostgreSQL. -- -- ---------------------------------------------------------------------------------------------------------------------------------------- -- FUNCTION: public.autoriasBIU() -- DROP FUNCTION IF EXISTS public."autoriasBIU"(); CREATE OR REPLACE FUNCTION public."autoriasBIU"() RETURNS trigger LANGUAGE 'plpgsql' COST 100 VOLATILE NOT LEAKPROOF AS $BODY$ declare vdias smallint; vMAXIMO smallint; begin select max(idautoria)+10 into vMAXIMO from autorias; IF vMAXIMO IS NULL THEN NEW.idautoria:=10; ELSE NEW.idautoria:=vMAXIMO; END IF; -- Até aqui se verificou o proximo valor da chave primária. -- Agora vamos verificar se o autor teve outra publicação em menos de 2 anos. select current_date-MAX(dtpublicacao) into vdias from livros inner join autorias on livros.idlivro=autorias.livroid where autorias.autorid=new.autorid group by autorias.autorid order by autorias.autorid; if ( vdias<731 ) then raise exception 'Autor (%) publicou a menos de 2 anos.',new.autorid; return null; else return new; end if; end; $BODY$; ALTER FUNCTION public."autoriasBIU"() OWNER TO postgres; COMMENT ON FUNCTION public."autoriasBIU"() IS 'Determina o próximo valor da CP. A seguir, verifica se o autor fez alguma publicação à menos de dois anos.'; -- Escrevendo o Gatilho na tabela autorias. -- Trigger: BIUautorias -- DROP TRIGGER IF EXISTS "BIUautorias" ON public.autorias; CREATE OR REPLACE TRIGGER "BIUautorias" BEFORE INSERT OR UPDATE ON public.autorias FOR EACH ROW EXECUTE FUNCTION public."autoriasBIU"(); -- Testando a Função de Gatilho e Gatilho -- verificando os dados em livros e autorias. copy livros2020 TO '/tmp/livros+2020.txt' using delimiters '|'; copy autorias TO '/tmp/autorias.txt' using delimiters '|'; -- os arquivos foram editados e os registros são: -- LIVROS: idlivro,txtituloacervo, nuisbn,editoraid,dtpublicacao,nuanopublicacao,qtpaginas,qtexemplaresacervo,qtexemplaresconsulta,dtcadlivro 10|Preparando pratos com Lagostas|\N | 1|2023-10-12 | 2010| \N| 20| 2|2011-08-01 100|A Menina que roubava Livros |\N | \N|2024-04-10 | 2007| \N| 75| 10|2007-05-10 -- AUTORIAS: idautoria, livroid, autorid, dtcadautoria 5 | 10| 10| 2011-10-10 10 | 10| 20| 2010-10-10 15 | 110| 10| 2019-09-21 -- Executando: insert into autorias values (null, 100, 10,'2024-04-18'); -- Tem-se a resposta do servidor: ERROR: Autor (10) publicou a menos de 2 anos. CONTEXT: função PL/pgSQL "autoriasBIU"() linha 23 em RAISE SQL state: P0001 -- A resposta da Função de Gatilho pode ser tratada na camada CGI por diversas linguagens de programação.