Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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 ;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.
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.
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:
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.
Diz o provedor ai pra mim não passar nem perto dele...
abraços
Marco
Tem como uma trigger inserir uma linha em uma tabela que esta em outro database ??
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
inserting data
END $$ DELIMITER $$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: