Jump to content
Sign in to follow this  
pablospfc

trigger atualizar coluna da mesma tabela em PostgreSQL

Recommended Posts

Olá pessoal boa tarde, estou tentando criar uma trigger para atualizar uma coluna da mesma tabela. Após inserir ou atualizar a tabela, a coluna irá receber o valor de outra coluna, mas em MD5.

 CREATE OR REPLACE FUNCTION setHash() RETURNS TRIGGER AS $hashCPF$
    BEGIN
       UPDATE tb_teste SET cpf_cnpj_hash = md5(NEW.cpf_cnpj::Text) WHERE cpf_cnpj = NEW.cpf_cnpj;
        RETURN new;
    END;
  $hashCPF$ language plpgsql;

   CREATE TRIGGER hashCPF AFTER INSERT OR UPDATE ON tb_teste
    FOR EACH ROW EXECUTE PROCEDURE setHash();

só que na hora de inserir os dados na tabela apresenta o seguinte erro:

ERROR:  stack depth limit exceeded
HINT:  Increase the configuration parameter "max_stack_depth" (currently 2048kB), after ensuring the platform's stack depth limit is adequate.
CONTEXT:  SQL statement "UPDATE tb_teste SET cpf_cnpj_hash = md5(NEW.cpf_cnpj::Text) WHERE cpf_cnpj = NEW.cpf_cnpj"
PL/pgSQL function sethash() line 5 at SQL statement
SQL statement "UPDATE tb_teste SET cpf_cnpj_hash = md5(NEW.cpf_cnpj::Text) WHERE cpf_cnpj = NEW.cpf_cnpj"

Não sei o que está acontecendo, alguém pode dar uma luz.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

  • Similar Content

    • By Felipe_N22
      Pessoal, como que eu crio uma rotina no MySQL para efetuar delete de registros inseridos nos últimos 30 dias, e fazer com que esse procedimento rode todos os dias automaticamente em determinado horário?
    • By Angelo_Pacheco
      Olá Pessoal!
      Faz tempo que não trabalho com BD e trigger e estou retornando.
      Estou com a seguinte situação
       
      Tenho 2 tabelas:
      glpi_tickets e glpi_plugin_fields_ticketoramentos
       
      Dentro do formulario ticket (tabela glpi_tickets) criei um campo otimizado chamado reprovado (tabela 
      glpi_plugin_fields_ticketoramentos) A tabela  glpi_plugin_fields_ticketoramentos se relaciona com glpi_tickets
       
      A situação é que se o usuario reprova o ticket, o mesmo terá de ser fechado.
       
      Estou montando a trigger
      CREATE TRIGGER TRG_fechaChamado
      AFTER  UPDATE
      ON glpi_tickets 
      FOR each row
      BEGIN
        
        SELECT g.reprovadofield 
               into @repro  
                    FROM  glpi_tickets t,
                         glpi_plugin_fields_ticketoramentos g
                    WHERE t.id = g.items_id
                    AND   g.reprovadofield = 0
                    AND   t.id = ????
                    
                           
          if @repro = 0 THEN
          
            UPDATE glpi_tickets SET status = 6 WHERE id ????
          
          END IF;
          
      END;
       
      Não estou conseguindo pegar o id do ticket a ser analisado para fechamento.
       
      Podem me ajudar??
       
       
       
       
       
    • By sidneypsoares
      Pessoal,
      Sou novo em trigger, agradeceria sua ajuda.
      Tenho um banco de dados de consumo de cliente. Acontece que quando vou inserir nova leitura para o cliente ele deve calcular o consumo atual.
      Mas acontece que pode haver uma virada na medição, ou seja, a leitura anterior está em 9999 e agora está 1, ele deve prever isso.
      Assim criei essa trigger:Gatilhos `historico`
      --
       
      DELIMITER $$ CREATE TRIGGER `consumo_atual` BEFORE INSERT ON `historico` FOR EACH ROW BEGIN DECLARE leitura_anterior int(5); DECLARE tempo int(5); SET leitura_anterior = (SELECT L.tb_leitura FROM historico L WHERE L.tb_instalacao=NEW.tb_instalacao ORDER BY L.tb_data DESC LIMIT 1); SET tempo = (SELECT DATEDIFF( CURRENT_DATE(),L.tb_data) AS valor FROM historico L WHERE L.tb_instalacao=NEW.tb_instalacao ORDER BY L.tb_data DESC LIMIT 1); IF (leitura_anterior <> '' ) THEN IF (NEW.tb_leitura > 0 and tempo >=1 and tempo <=30) THEN IF (NEW.tb_op = 1) THEN CASE WHEN (NEW.tb_diais= '4' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >= 9000) THEN SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 10000) * NEW.tb_const, NEW.tb_cod = '137'; WHEN (NEW.tb_diais= '5' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >= 90000) THEN SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 100000) * NEW.tb_const, NEW.tb_cod ='137'; WHEN (NEW.tb_diais= '6' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >=900000) THEN SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 1000000) * NEW.tb_const, NEW.tb_cod ='137'; ELSE BEGIN SET NEW.tb_consumo = (NEW.tb_leitura - leitura_anterior) * NEW.tb_const; END; END CASE; ELSE SET NEW.tb_consumo = 0; END IF; ELSE SET NEW.tb_consumo = 0; END IF; ELSE SET NEW.tb_consumo =NEW.tb_leitura * NEW.tb_const; END IF; END $$ DELIMITER ;  
      Essa é a estrutura do  banco:
      Estrutura para tabela `historico`
      --
      CREATE TABLE `historico` ( `tb_id` int(11) NOT NULL, `tb_instalacao` varchar(10) NOT NULL, `tb_reg` char(3) NOT NULL, `tb_unidade` varchar(8) NOT NULL, `tb_local` varchar(4) NOT NULL, `tb_razao` varchar(2) NOT NULL, `tb_data` date NOT NULL, `tb_adm` int(11) NOT NULL, `tb_contrato` varchar(10) NOT NULL, `tb_leitura` int(5) NOT NULL, `tb_cod` varchar(4) DEFAULT NULL, `tb_mat` int(11) DEFAULT NULL, `tb_sgl` int(5) DEFAULT NULL, `tb_subsigla` int(5) DEFAULT NULL, `tb_op` int(11) NOT NULL DEFAULT '0', `tb_consumo` float DEFAULT NULL, `tb_provavel` int(6) DEFAULT NULL, `tb_minima` int(6) DEFAULT NULL, `tb_faturada` int(6) DEFAULT NULL, `tb_acerto` int(6) DEFAULT NULL, `tb_obs` varchar(150) DEFAULT NULL, `tb_f1` char(1) DEFAULT NULL, `tb_f2` char(1) DEFAULT NULL, `tb_f3` char(1) DEFAULT NULL, `tb_ver` char(1) NOT NULL DEFAULT 'N', `tb_seq` int(5) DEFAULT NULL, `tb_seqdig` int(11) DEFAULT NULL, `tb_A02` varchar(3) DEFAULT NULL, `tb_nome` varchar(50) DEFAULT NULL, `tb_medidor` varchar(12) NOT NULL, `tb_diais` varchar(3) NOT NULL, `tb_const` int(5) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
       
      E esse é o registro:
       
      INSERT INTO `historico` ( `tb_instalacao`, `tb_reg`, `tb_unidade`, `tb_local`, `tb_razao`, `tb_data`, `tb_adm`, `tb_contrato`, `tb_leitura`, `tb_cod`, `tb_mat`, `tb_sgl`, `tb_subsigla`, `tb_op`, `tb_consumo`, `tb_provavel`, `tb_minima`, `tb_faturada`, `tb_acerto`, `tb_obs`, `tb_f1`, `tb_f2`, `tb_f3`, `tb_ver`, `tb_seq`, `tb_seqdig`, `tb_A02`, `tb_nome`, `tb_medidor`, `tb_diais`, `tb_const`) VALUES ('3013639052', '03', '01330101', '3301', '01', '2019-05-01', 1, '4680005077', 90001, '1801', 0, 0, NULL, 1, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 1, 1, NULL, 'SIDNEY PORTELA SOARES', 'APC099037055', '5', 1); COMMIT; INSERT INTO `historico` ( `tb_instalacao`, `tb_reg`, `tb_unidade`, `tb_local`, `tb_razao`, `tb_data`, `tb_adm`, `tb_contrato`, `tb_leitura`, `tb_cod`, `tb_mat`, `tb_sgl`, `tb_subsigla`, `tb_op`, `tb_provavel`, `tb_minima`, `tb_faturada`, `tb_acerto`, `tb_obs`, `tb_f1`, `tb_f2`, `tb_f3`, `tb_ver`, `tb_seq`, `tb_seqdig`, `tb_A02`, `tb_nome`, `tb_medidor`, `tb_diais`, `tb_const`) VALUES ('3013639052', '03', '01330101', '3301', '01', '2019-06-01', 1, '4680005077', 7, '1801', 0, 0, NULL, 1, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 'N', 1, 1, NULL, 'SIDNEY PORTELA SOARES', 'APC099037055', '5', 1); COMMIT;
       
       
      Observe que a leitura do cliente em 2019-05-01 foi 90001 e em 2019-05-01 foi 7 e como o campo tb_diais é 5  houve uma virada na medição então o CASE deveria aceitar o calculo :
       
      WHEN (NEW.tb_diais= '5' AND leitura_anterior > NEW.tb_leitura AND leitura_anterior >= 90000) THEN SET NEW.tb_consumo = ((NEW.tb_leitura - leitura_anterior) + 100000) * NEW.tb_const, NEW.tb_cod ='137';  
       
      Mas justamente não está fazendo, ele apenas coloca no consumo o valor 0.
       
      Alguém poderia me ajudar?
       
       
    • By cfreis01
      eu tenho uma tabela  funcionário com uma coluna salário e criei uma nova coluna do tipo salário eu pensei em uma trigger
      para que todas as vezes que um funcionário receba um aumento, nessa nova coluna seja registrada a quantia do último aumento recebido
      mas quando executo o update da erro;
      outra duvida dentro do update como o update sabe que é só deste  funcionario? o que colocar na clausula where dentro da trigger?
      CREATE OR REPLACE TRIGGER new_salario_emp BEFORE UPDATE ON emp FOR EACH ROW -- DECLARE salario number; BEGIN salario := :new.sal - :OLD.sal; -- update emp set old_salario = salario; commit; -- END;  
    • By rsrodrigoam
      Alguém poderia me ajudar com a seguinte consulta?   Tab_base gtin(PK) | cod_entr | aliq_entr | cod_saida | aliq_saida     Tab_consulta cod_barra | cod_entr | aliq_entr | cod_saida | aliq_saida | status_saida | corr_saida | status_entr | corr_entr    A Tab_consulta é importada e deve consultar se existe o cod_barra igual ao gtin da Tab_base. Em caso positivo, preciso consultar os campos que tem informação na Tab_consulta de códigos e alíquotas, quando tiver informação cruzar com a Tab_base para validar se está correto, se estiver correto (status_* = 'OK'), se estiver diferente (status_* = 'inválido' and corr_* = "alíquota certa vindo da Tab_base").   Desde já agradeço a ajuda.
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.