-- 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. -- -- ---------------------------------------------------------------------------------------------------------------------------------------- -- Proposição: -- Desenvolva um gatilho (uma TF - Trigger Function + Trigger) que implemente o valor de um campo Chave Primária em -- uma tabela atribuindo o valor incrementado em 5 unidades em relação ao máximo valor da CP da tabela. -- SE a tabela estiver vazia o primeiro valor deve ser atribuído com valor 5. -- Determinando o nome do gatilho: -- Escolha uma tabela: -- Eventos: INSERT de linhas na tabela e -- Momentos: ANTES da inserção da linha na tabela -- -- Nome: pedvendasbi() -- Algoritmizando: declare vreg smallint; InicioBloco mreg <- pesquisar o ultimo valor da cp gravado; **Cuidado** Muitos DBA encontram esta especificação de pesquisa, MAS nem todo o SGBD responde isso facilmente. Lembre-se da analogia: uma tabela é uma cômoda de roupas com gavetas que podem ser 'acrescentadas' (aumentando a altura) ou com gavetas vazias (que tiveram seu conteúdo DELETADO) que são 'preenchidas' pelo SGBD quando se fazem novos 'INSERTs' na tabela. TALVEZ o melhor 'entendimento' desta especificação seja esta: [determinar o máximo valor gravado no campo que é a chave primária da tabela], Para responder isso, pode-se usar a função MAX() - Disponível em mais de 90% dos SGBDs. SE um DBA quiser documentar o gatilho pode escrever o comando SQL que resolve a especificação, assim: select MAX(campo) into vreg from tabela; SE ( mreg é nulo ) ** Cuidado ** verifique qual o retorno da função MAX() no caso de processar um valor NULO. Aparentemente, à partir da versão 12 do PostgreSQL o processamento de função ao retornar NULO indica o valor ZERO para o retorno da função. ENTÃO NEW.cppedvenda <- 5; SENÃO NEW.cppedvenda <- mreg + 5; FIM SE; retorna NEW; FimBloco; -- construindo a TF em plpgsql - procedural language of PostGreSQL declare mreg smallint; begin select MAX(cppedvenda) INTO mreg from pedvendas; if ( mreg is null ) then NEW.cppedvenda := 5; else NEW.cppedvenda := mreg + 5; end if; return new; end; --