Ir para conteúdo
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;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora

  • Conteúdo Similar

    • Por 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
    • Por Leandro de Jesus
      Senhores muito boa tarde,
      Preciso de uma luz.
       
       
      Depois de executar o trigger
      Preciso comparar os campos de duas tabelas
       
      Então após atualizar a tabela px_pedidos eu pego os dados e coloco px_pedidos_log e depois preciso comparar os campos
      O código abaixo funciona, só não consigo comparar.
       
      DROP TRIGGER IF EXISTS `LogPedido`; CREATE DEFINER=`root`@`localhost` TRIGGER `LogPedido` BEFORE UPDATE ON `px_pedidos` FOR EACH ROW insert into px_pedidos_log select * from px_pedidos WHERE id=NEW.id  
      Logo após tentei  e não foi 

       
      IF(NEW.campo != OLD.campo) THEN         UPDATE px_pedidos SET alteracoes +=1 WHERE id=NEW.id; END IF;  
      Alguém pode me dar um caminho ? Já rodei a internet mas não estou conseguindo implantar isso.
       
      Abs e obrigado
       
    • Por brunonative
      Bom dia pessoal!
      Estou passando um sufoco aqui na criação de um sistema.
       
      É o seguinte, existem 5 tabelas: Membros | Objetivos | Email | Perguntas | Respostas
      O Administrador cadastra os membros, cria o email (dentro do sistema tem um editor WYSIWYG), perguntas e respostas.
      O administrador na hora de fazer o cadastro ou edição do membro, ele diz qual vai ser o próximo objetivo, qual email vai ser enviado, qual a pergunta que vai junto com o email e qual reposta .. junto com a edição vem A DATA E A HORA PRA ISSO ACONTECER.
       
      A dúvida é a seguinte: Como crio um Trigger para enviar o email criado naquela determinada data e hora?
    • Por josePeixoto
      Olá,
       
      quando tento executar a trigger abaixo, ele me retorna 
      Erro(56,16): PLS-00306: wrong number or types of arguments in call to '||'  
      create or replace TRIGGER API_SIM_PF_ATUALIZA_DENTALIS BEFORE INSERT OR UPDATE ON PESSOA_FISICA FOR EACH ROW DECLARE type t_num is table of number; DS_EMAIL_W t_num; TELEFONE_RES_W t_num; TELEFONE_COM_W t_num; ESTADO_CIVIL_W VARCHAR2(255); ENDERECO_RES_W t_num; NUMERO_W t_num; BAIRRO_RES_W t_num; COMPLEMENTO_RES_W t_num; CIDADE_RES_W t_num; CEP_RES_W t_num; ENDERECO_COM_W t_num; NUMERO_COM_W t_num; BAIRRO_COM_W t_num; COMPLEMENTO_COM_W t_num; CIDADE_COM_W t_num; CEP_COM_W t_num; PROFISSIONAL_W VARCHAR2(255); SEXO_W VARCHAR2(255); DT_NASCIMENTO_W t_num; BEGIN SELECT DISTINCT CP.DS_EMAIL, ('('||nr_ddd_telefone||')'||nr_telefone), ('('||nr_ddd_telefone||')'||nr_telefone), (SELECT CP1.DS_ENDERECO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.NR_ENDERECO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.DS_BAIRRO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.DS_COMPLEMENTO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.DS_MUNICIPIO FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), (SELECT CP1.CD_CEP FROM COMPL_PESSOA_FISICA CP1 WHERE CP1.CD_PESSOA_FISICA = :NEW.CD_PESSOA_FISICA AND CP1.IE_TIPO_COMPLEMENTO = 1), TO_CHAR(:NEW.DT_NASCIMENTO,'"YYYY-MM-DD HH24:MI:SS') BULK COLLECT INTO DS_EMAIL_W,TELEFONE_RES_W,TELEFONE_COM_W,ENDERECO_RES_W,NUMERO_W,BAIRRO_RES_W,COMPLEMENTO_RES_W,CIDADE_RES_W,CEP_RES_W,/*ENDERECO_COM_W,NUMERO_COM_W,BAIRRO_COM_W,COMPLEMENTO_COM_W, CIDADE_COM_W,CEP_COM_W,*/DT_NASCIMENTO_W FROM TASY.COMPL_PESSOA_FISICA CP WHERE CP.CD_PESSOA_FISICA =:NEW.CD_PESSOA_FISICA AND CP.IE_TIPO_COMPLEMENTO = 1; SELECT V.DS_VALOR_DOMINIO INTO ESTADO_CIVIL_W FROM VALOR_DOMINIO V WHERE CD_DOMINIO = 5 AND V.VL_DOMINIO = :NEW.IE_ESTADO_CIVIL; SELECT CA.DS_CARGO INTO PROFISSIONAL_W FROM CARGO CA WHERE CA.CD_CARGO = :NEW.CD_CARGO; SELECT V.DS_VALOR_DOMINIO INTO SEXO_W FROM VALOR_DOMINIO V WHERE CD_DOMINIO = 4 AND V.VL_DOMINIO = :NEW.IE_SEXO; BEGIN SEND_DB_REQUST_PROC ('http://628186fc.ngrok.io/DentalisIntegration-1.0.0/dentalis/createuser', '{ "nome":' || :NEW.NM_PESSOA_FISICA ||','|| '"codigo_externo":' || :NEW.CD_PESSOA_FISICA ||','|| '"codigo_plano":' || 694 ||','|| '"matricula":' || :NEW.CD_PESSOA_FISICA || ',' || '"cpf":' || :NEW.NR_CPF ||','|| '"rg":' || :NEW.NR_IDENTIDADE || ',' || '"email":' || DS_EMAIL_W || ',' || '"telefone_res":' || TELEFONE_RES_W ||','|| '"telefone_com":' || TELEFONE_COM_W || ',' || '"celular":' || :NEW.NR_TELEFONE_CELULAR || ',' || '"observacao":' || :NEW.DS_OBSERVACAO || ',' || '"estado_civil":' || ESTADO_CIVIL_W || ',' || '"profissao":' || PROFISSIONAL_W || ',' || '"sexo":' || SEXO_W || ',' || '"data_nascimento":' || DT_NASCIMENTO_W || ',' || '"endereco_res":' || ENDERECO_RES_W || ',' || '"numero_res":' || NUMERO_W || ',' || '"bairro_res":' || BAIRRO_RES_W || ',' || '"complemento_res":' || COMPLEMENTO_RES_W || ',' || '"cidade_res":' || CIDADE_RES_W || ',' || '"cep_res":' || CEP_RES_W || ',' || '"endereco_com": "",' || '"numero_com":"",' || '"bairro_com":"",' || '"complemento_com":"",' || '"cidade_com":"",' || '"cep_com":""' || '}'); exception when others then raise_application_error(-20000,'Erro: '|| sqlerrm); END; END;  
      Alguém sabe o que pode ser? 
       
      Obrigado desde já pela atenção!
    • Por Paul Walker
      Preciso desenvolver um sistema que automatiza o atendimento a alunos feitos por coordenadores.
      Quando algum aluno chegar na secretária e pedir para ser atendido por algum coordenador, ela vai cadastrar no sistema essa solicitação de atendimento. Este aluno entrara na fila do referido coordenador.
      Então fiz duas tabelas. "Fila" que é a da secretária que vai cadastrar e a  "Coordenador" que é as informações dele.
      o que quero é passar somente as seguintes informações da fila para o coordenador:
      Nome, Curso, se já é aluno, status e data/hora.
      até agora está desse jeito, e não sei como fazer para passar essas informações automaticamente para ele, alguém pode me ajudar? Estou usando o Workbench.
       
      SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
      SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
      SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
      CREATE SCHEMA IF NOT EXISTS `at_automatizado` DEFAULT CHARACTER SET utf8 ;
      USE `at_automatizado` ;
      -- -----------------------------------------------------
      -- Table `at_automatizado`.`coordenador`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `at_automatizado`.`coordenador` (
        `codigo` INT NOT NULL AUTO_INCREMENT,
        `login` VARCHAR(45) NULL,
        `senha` VARCHAR(45) NULL,
        `nome_coordenador` VARCHAR(100) NULL,
        `ramal` VARCHAR(9) NULL,
        `curso` VARCHAR(45) NULL,
        PRIMARY KEY (`codigo`))
      ENGINE = InnoDB;

      -- -----------------------------------------------------
      -- Table `at_automatizado`.`fila`
      -- -----------------------------------------------------
      CREATE TABLE IF NOT EXISTS `at_automatizado`.`fila` (
        `codigo` INT NOT NULL AUTO_INCREMENT,
        `coordenador_codigo` INT NOT NULL,
        `nome_coordenador` VARCHAR(100) NULL,
        `nome_aluno` VARCHAR(100) NULL,
        `telefone` VARCHAR(14) NULL,
        `curso` VARCHAR(100) NULL,
        `ja_e_aluno` ENUM('Sim', 'Não') NULL,
        `status` ENUM('Já atendido', 'Não atendido') NULL,
        `data_e_hora` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
        PRIMARY KEY (`codigo`),
        INDEX `fk_fila_coordenador_idx` (`coordenador_codigo` ASC),
        CONSTRAINT `fk_fila_coordenador`
          FOREIGN KEY (`coordenador_codigo`)
          REFERENCES `at_automatizado`.`coordenador` (`codigo`)
          ON DELETE NO ACTION
          ON UPDATE NO ACTION)
      ENGINE = InnoDB;

      SET SQL_MODE=@OLD_SQL_MODE;
      SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
      SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.