Jump to content
Leandro de Jesus

IF's na Trigger

Recommended Posts

Senhores muito boa noite,

 

Eu tenho o seguinte funcionando:

 

IF(OLD.idDepartamentos <> NEW.idDepartamentos)
THEN
	INSERT INTO px_pedidos_log
    (idPedido,
     campo,
     valor_novo,
     valor_antigo
  	) 
    	values 
    (NEW.id,
     'idDepartamentos',
     NEW.idDepartamentos,
     OLD.idDepartamentos
    );    
END IF

 

Eu queria fazer isso com mais campos na mesma trigger.

Tentei abaixo e dá erro.

Alguma luz para fazer isso ?


Preciso fazer isso com 6 campos.

 

IF(OLD.idDepartamentos <> NEW.idDepartamentos)
THEN
	INSERT INTO px_pedidos_log
    (idPedido,
     campo,
     valor_novo,
     valor_antigo
  	) 
    	values 
    (NEW.id,
     'idDepartamentos',
     NEW.idDepartamentos,
     OLD.idDepartamentos
    );    
END IF;

IF(OLD.idAcao <> NEW.idAcao)
THEN
	INSERT INTO px_pedidos_log
    (idPedido,
     campo,
     valor_novo,
     valor_antigo
  	) 
    	values 
    (NEW.id,
     'idAcao',
     NEW.idAcao,
     OLD.idAcao
    );    
END IF;

 

 

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

  • Similar Content

    • 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 Robson Freitas
      Tenho uma tabela de cadastro do SQL Server, tenho uma coluna que apresenta o status desse cadastro ('A','I','S','C').
       
      Criei um campo com nome Update_data, que receberá um datatime toda vez que o cliente alterar o status do cadastro. Isso também vale para um insert.
       
      Estou com dúvidas, pois nunca criei uma Trigger em sql server.
       
      Ex: da minha tabela
       ID | Processo | status | Update_data
        1 | A33      | A      | null
      2   | A34      | I      | null
      3    | A55      |     A | null
       
      Não consegui avançar no seguinte exemplo abaixo trigger: 
      CREATE TRIGGER atualizaData
      ON cadastro
      AFTER INSERT,UPDATE
      AS
      IF INSERT OR UPDATE(status)
      BEGIN
      UPDATE cadastro SET Update_data = GETDATE()
      WHERE id = id_que_foi_modifica/inserida
      END
       
      Ao final, será atualizado com a data atual somente se houver modificação ou inserção no campo da situação.
    • By gmadeira
      Boa tarde, tenho 2 tabelas "prodvdarm" que cadastro produtos de ema empresa com:
      codVendedor - int,
      codArmar - int,
      quantidade int,
      valor - numeric 12,2,
      dataentra - data tabela "entradarm"
      codVendedor - int,
      codArmar - int,
      quantidade int,
      valor - numeric 12,2,
       
      Conheço pouco de triggers então pelos exemplos tentei fazer esta que te enviei, preciso de uma para entrar com os dados checar se existe este código vendedor e código armarinho, existindo atualiza(update) a quantidade e o valor - se não existir entra com novos dados(insert) fia assim mais ta dando erro
       
      CREATE DEFINER=`root`@`localhost` TRIGGER `bailledados`.`trg_entradarm_entrada` BEFORE INSERT ON `entradarm` FOR EACH ROW BEGIN declare codVendedor int; declare codArmar int; select codVendedor codArmar from prodvdmat; IF (codVendedor <> new.codVendedor and codArmar <> new.codArmar) then insert into prodvdmat(codVendedor, codArmar, quantidade, valor, datacompra) values (new.codVendedor, new.codArmar, new.quantidade, new.valor, now()); else UPDATE prodvdmat SET quantidade = quantidade + new.Quantidade, valor = valor + new.valor WHERE codVendedor = new.codVendedor and codArmar = new.codArmar; end if; END  
    • By gmadeira
      Boa tarde,
       
      Tenho a seguinte tabela:
       
      CREATE TABLE prodvdedor (
      codPrdvdor int(10) NOT NULL AUTO_INCREMENT,
      codVendedor int(11) NOT NULL,
      codTecido int(11) NOT NULL,
      codCor int(11) NOT NULL,
      medida decimal(10,2) DEFAULT NULL,
      stockMedidas decimal(10,2) DEFAULT NULL,
      peso decimal(10,4) DEFAULT NULL,
      stockPeso decimal(10,4) DEFAULT NULL,
      dataCompra date NOT NULL,
      valor decimal(10,2) NOT NULL,
      PRIMARY KEY (codPrdvdor),
      KEY PK_prodvdedor_vendededor_idx (codVendedor),
      KEY Pk_prodvdedor_tecidos_idx (codTecido),
      KEY Pk_prodvdedor_cores_idx (codCor),
      CONSTRAINT Pk_prodvdedor_cores FOREIGN KEY (codCor) REFERENCES cores (codCor) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT Pk_prodvdedor_tecidos FOREIGN KEY (codTecido) REFERENCES tecidos (codTecido) ON DELETE CASCADE ON UPDATE CASCADE,
      CONSTRAINT PK_prodvdedor_vendedores FOREIGN KEY (codVendedor) REFERENCES vendedores(codVendedor) ON DELETE CASCADE ON UPDATE CASCADE
      ) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;Pciso criar uma trigger 
       
      preciso criar uma trigger para atualizar os campos stockMedidas e stockPeso, quando digito os dados ela procura se tem outra informação com os campos pedidos e atualiza, fiz da seguinte maneira:
       
      CREATE DEFINER=`root`@`localhost` TRIGGER `bailledados`.`trg_AtualizarProdVendor` BEFORE INSERT ON `prodvdedor` FOR EACH ROW BEGIN SET @stockAntigo = (SELECT stockMedidas FROM prodvdedor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor); UPDATE prodvdedor SET stockMedidas=@stockAntigo+new.medida WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor; SET @stockAntigo1 = (SELECT stockPeso FROM prodvdedor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor); UPDATE prodvdedor SET stockPeso=@stockAntigo1+new.peso WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor; SET @valorAntigo = (SELECT valor FROM prodvdedor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor); UPDATE prodvdedor SET valor=@valorAntigo1+new.valor WHERE codVendedor=new.codVendedor and codTecido=new.codTecido and codCor=new.codCor; END  Só que não funciona da erro:
       
      insert 
          into
              bailledados.prodvdedor
              (codCor, codTecido, codVendedor, medida, stockMedidas, peso, stockPeso, dataCompra, valor) 
          values
              (?, ?, ?, ?, ?, ?, ?, ?, ?)
      WARN:   SQL Error: 1442, SQLState: HY000
      ERROR:   Can't update table 'prodvdedor' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.
      Informações:   could not execute statement
×

Important Information

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