Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Aureo Almeida

Criando trigger para inserir dados de uma tabela em outra

Recommended Posts

Estou tentando criar duas trigger no mysql, pela primeira vez. Uma que insere dados em uma tabela após eles terem sido inseridos em outra e outra que atualiza. A tabela de origem dos dados chama-se vtn_revendas, e a tabela em cujos dados a trigger irá inserir os dados ou atualizar chama-se vtn_usuarios.

Entre outros, a tabela vtn_revendas tem os seguintes campos: vtn_nome, vtn_email, vtn_senha, vtn_nivel.

Já a tabela vtn_usuarios tem os seguintes campos: usu_id, usu_nome,usu_email, usu_senha, usu_nivel.

Em relação a trigger de insert, criei o seguinte código até agora:

DELIMITER $$
CREATE TRIGGER insert_us_rev AFTER INSERT ON vtn_revendas
FOR EACH ROW BEGIN
INSERT INTO vtn_usuarios  
SET  REV_NOME = NEW.USU_NOME;  
SET REV_EMAIL = NEW.USU_EMAIL ; 
SET REV_SENHA = NEW.USU_SENHA ; 
SET  REV_NIVEL = NEW.USU_NIVEL ;
END $$
DELIMITER ;

Minha dúvida em relação a esta trigger de insert é: como fazer um auto incremento no campo usu_id. Na estrutura da tabela ele está como auto_increment.

Não consegui testar se o MYSQL cria o auto incremento no momento de inserção, pois a sintaxe acima está me dando a seguinte mensagem de erro quando tento criá-la através do PhpMyAdmin:

#1193 - Variável de sistema 'REV_EMAIL' desconhecida.

Espero que alguem possa me auxiliar.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para te ajudar a debugar a trigger, criei este ambiente e coloquei o trigger como deve ser, com as variáveis previamente iniciadas ou declaradas e com a consulta INSERT corretamente escrita:

 

use test;

DELIMITER $$
CREATE TRIGGER insert_us_rev AFTER INSERT ON test.vtn_revendas
FOR EACH ROW
BEGIN
# declaring variables
DECLARE REV_NOME  CHAR(80);
DECLARE REV_EMAIL CHAR(80);
DECLARE REV_SENHA CHAR(80);
DECLARE REV_NIVEL CHAR(80);

# inserting data
INSERT INTO vtn_usuarios
        SET  REV_NOME =  NEW.USU_NOME,
            REV_EMAIL = NEW.USU_EMAIL,
            REV_SENHA = NEW.USU_SENHA,
            REV_NIVEL = NEW.USU_NIVEL;
END $$
DELIMITER $$

create table test.vtn_usuarios (rev_nome char(80), urevmail char(80), rev_senha char(80), rev_nivel char(80)) $$

create table test.vtn_revendas (usu_nome char(80), usu_email char(80), usu_senha char(80), usu_nivel char(80)) $$

 

Os tipos de dados declarados para cada variável não precisa seguir o que eu passei, seria melhor seguir os mesmos tipos de dados definidos na estrutura de sua tabela.

 

:joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vagner

Obrigado pela dica.

Antes que tu desse a sugestão, eu vi um exemplo que deu certo, com o seguinte código:

DELIMITER $$
CREATE TRIGGER insert_us_rev AFTER INSERT ON vtn_revendas
FOR EACH ROW BEGIN
INSERT INTO vtn_usuarios  (USU_ID, USU_NOME, USU_EMAIL, USU_SENHA, USU_NIVEL) values ("", NEW.REV_NOME, NEW.REV_EMAIL, NEW.REV_SENHA, NEW.REV_NIVEL);
END $$
DELIMITER ;

Este código está funcionando certinho, e a cada registro inserido na tabela vtn_revendas, ele atualiza os campos que desejo na tabela vtn_usuarios.

Minha dificuldade está em construir o SQL de atualização.

O campo com valor único é o campo email. A intenção é buscar na tabela vtn_usuarios o registro que correponde ao email da tabela vtn_revenda atualizado.

Em tese o código seria:

DELIMITER $$
CREATE TRIGGER update_us_rev AFTER UPDATE ON vtn_revendas
FOR EACH ROW BEGIN

DECLARE REV_NOME  CHAR(50);
DECLARE REV_EMAIL CHAR(60);
DECLARE REV_SENHA CHAR(12);
DECLARE REV_NIVEL INT(11);

UPDATE vtn_usuarios 
        SET  REV_NOME =  USU_NOME,
            REV_EMAIL = USU_EMAIL,
            REV_SENHA = USU_SENHA,
            REV_NIVEL = USU_NIVEL

WHERE USU_EMAIL = REV_EMAIL;

END $$
DELIMITER ;

O problema é que a atualização ocorre na tabela vtn_revendas e não ocorre na tabela vtn_usuarios. Ou seja, a trigger não está funcionando.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O trigger funcionando você já tem, agora é só colocar mais uma variável, selecionar o e-mail da tabela que já recebeu os dados como valor desta nova variável e ao invés de INSERT, você colocar um UPDATE... WHERE EMAIL = var_email na outra tabela, "simples como um copo de nescau gelado". Vai que eu estou te vendo :)

 

Manda ver, se tiver dúvidas, posta que o pessoal te ajuda.

 

:joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

O script funcionou certinho da seguinte forma:

DELIMITER $$
CREATE TRIGGER update_us_rev AFTER UPDATE ON vtn_revendas
FOR EACH ROW BEGIN
UPDATE vtn_usuarios 
        	    SET USU_NOME = NEW.REV_NOME ,
            USU_EMAIL = NEW.REV_EMAIL,
            USU_SENHA = NEW.REV_SENHA,
            USU_NIVEL = NEW.REV_NIVEL  

WHERE USU_EMAIL = OLD.REV_EMAIL;

END $$
DELIMITER ;

Porém, o brabo depois de achar a reposta que eu queria testando localmente, em que consegui desenvolver o script que eu considerava adequado para dar a resposta que eu queria, é receber a reposta do provedor de hospedagem que o servidor de Banco de Dados MySql deles não suporta trigger... É de rir. Não sei se de mim que não vi isso antes ou deles, que ainda não se adaptaram às novas versões do Mysql.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

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