Desenvolvimento de Gatilhos.

-- 12.	Um professor somente pode ter atribuições em disciplinas de cursos onde ele houver obtido as
--     habilitações indicativas para ministrar as disciplinas destes cursos.
--      Analisando o processo necessário para desenvolvimento do gatilho:
--      Tabela.: atribuicoes
--      Evento.: INSERT
--      Momento: BEFORE
--      Para verificar se o professor pode ser atribuido às disciplinas dos cursos... começamos
--      pela tabela habilitacoes procurando os registros de habilitações do professor escrito 
--      no campo professorid na nova linha de atribuicoes...
--      o Comando INSERT INTO atribuicoes pode ser escrito assim:
    INSERT INTO atribuicoes (idatribuicao,professorid,disciplinaid,qthorasatribuidas,dtatribuicao,dtcadatribuicao)
           VALUES (40,21,8,80,'2022-09-30','2022-10-18');
--      o comando de verificação das habilitações do professor do comando acima pode ser escrito assim:
    SELECT count(*) AS QtdDisc FROM habilitacoes AS h INNER JOIN cursos AS c ON h.cursoid=c.idcurso
                                                      INNER JOIN disciplinas AS d ON c.idcurso=d.cursoid
             WHERE professorid='NEW.professorid' AND d.iddisciplina='NEW.disciplinaid';
--      identifica-se aqui o comando necessário para a verificação do Gatilho que será escrito.
--      Depois de desenvolvido a Função de Gatilho (Trigger Function) e o Gatilho (Trigger) as Sequencias de 
# Códigos que definem estes objetos são:
# Este comando define a existência da Funcção de Gatilho
CREATE OR REPLACE FUNCTION public.atribuicoesbi()
    RETURNS trigger
    LANGUAGE 'plpgsql'
    COST 100
    VOLATILE NOT LEAKPROOF
AS $BODY$
declare
 vQtdDisc smallint;
BEGIN
 SELECT count(*) into vQtdDisc FROM habilitacoes AS h INNER JOIN cursos AS c ON h.cursoid=c.idcurso
                                                      INNER JOIN disciplinas AS d ON c.idcurso=d.cursoid
             WHERE professorid='NEW.professorid' AND d.iddisciplina='NEW.disciplinaid';
  if ( vQtdDisc >= 1 )
	then
	  return new;
	else
	  raise exception 'A disciplina (%) NÃO pode ser atribuida ao professor (%)',NEW.disciplinaid,NEW.professorid;
	  return null;
	end if;
END;
$BODY$;

ALTER FUNCTION public.atribuicoesbi()
    OWNER TO postgres;

# E este comando define o Gatilho existente na Tabela:
CREATE TRIGGER biatribuicoes
    BEFORE INSERT
    ON public.atribuicoes
    FOR EACH ROW
    EXECUTE FUNCTION public.atribuicoesbi();
