M3nTaL 0 Denunciar post Postado Maio 7, 2008 Boas, estou a precisar de uma ajudinha com triggers :). Aqui vai a minha duvida: Tenho uma tabela MONITOR(id,estado), esta tabela contem o estado "LIGADO" ou "DESLIGADO" de um respectivo dispositivo. Sempre que existir uma alteracao nesta tabela(ON UPDATE) eu quero inserir esses dados(id e estado) em uma tabela temporaria -> ALTERACOES(id,estado). O problema é k so tou conseguindo actualizar se o id nao existir na tabela ALTERACOES, ou seja tenho de estar sempre a fazer TRUNCATE da tabela ALTERACOES.. Existe alguma forma de actualizar a tabela mm quando esta ja tem um determinado valor de id? Pk eu so kero actualizar o estado.. Aqui vai o codigo que tenho.. CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW INSERT INTO alteracoes VALUES(OLD.id,NEW.estado); Brigadao :) Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 8, 2008 Sempre que existir uma alteracao nesta tabela(ON UPDATE) eu quero inserir esses dados(id e estado) em uma tabela temporaria -> ALTERACOES(id,estado). O problema é k so tou conseguindo actualizar se o id nao existir na tabela ALTERACOES seguinte, essa tua tabela temporária está adotando o id como chave primária e por isso não está deixando tu gravar dados com o id repetido. desvincula ele como pk ou cria um outro campo (id_pk) e coloca ele como chave primária e seta ele como auto incremento. Compartilhar este post Link para o post Compartilhar em outros sites
M3nTaL 0 Denunciar post Postado Maio 8, 2008 Sempre que existir uma alteracao nesta tabela(ON UPDATE) eu quero inserir esses dados(id e estado) em uma tabela temporaria -> ALTERACOES(id,estado). O problema é k so tou conseguindo actualizar se o id nao existir na tabela ALTERACOES seguinte, essa tua tabela temporária está adotando o id como chave primária e por isso não está deixando tu gravar dados com o id repetido. desvincula ele como pk ou cria um outro campo (id_pk) e coloca ele como chave primária e seta ele como auto incremento. Brigado pela dica..mas acho que assim tenho outro problema :(.. Vou ficar com 2 linhas de id igual mas estado diferente..a ideia era actualizar o estado se esse id ja existir, para ter apenas uma informação acerca desse id.. Eu tentei da seguinte forma mas está dando erro de sintaxe.. CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW BEGIN IF NOT EXISTS(SELECT estado_tmp FROM alteracoes WHERE id_tmp = OLD.id) THEN INSERT INTO alteracoes VALUES(OLD.id,NEW.estado); ELSE UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id; END IF; END modificou; N estou detectando o problema.. Valeu Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 9, 2008 é que você tinha falado em inserir os dados na tabela temporária, eu não sabia que não podia repetir o id. Achei que não poderia estar repetido na tabela MONITOR, nas ALTERACAO poderia. O que você pode fazer é repetir o id na tabela ALTERACAO e colocar a data de inserção, aí você pega sempre o registro com a maior data. mas vamos tentar do teu jeito. qual é o erro de sintaxe que está dando?? e no insert você não colocou quais são os campos que vão receber os valores INSERT INTO alteracoes VALUES(OLD.id,NEW.estado); INSERT INTO alteracoes (campo_1, campo_2) VALUES(OLD.id,NEW.estado); modifica isso e tenta de novo de onde você busco o old.id??? Compartilhar este post Link para o post Compartilhar em outros sites
M3nTaL 0 Denunciar post Postado Maio 9, 2008 ja modifiquei mas continua a dar este erro : "Você tem um erro de sintaxe no seu SQL próximo a 'INSERT INTO alteracoes(id_tmp,estado_tmp) VALUES(OLD.id,NEW.estado)' na linha 6" O OLD.id é o campo id da tabela MONITOR(id,estado). Nesta tabela eu só actualizo o campo estado, o id é chave primaria nunca é alterado. o codigo agora esta desta forma: CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW BEGIN IF NOT EXISTS(SELECT estado_tmp FROM alteracoes WHERE id_tmp = OLD.id) THEN INSERT INTO alteracoes(id_tmp,estado_tmp) VALUES(OLD.id,NEW.estado); ELSE UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id; END IF; END modificou; Será k n posso fazer isso em MySQL? Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 9, 2008 tabela MONITOR(id,estado) tabela temporaria -> ALTERACOES(id,estado). INSERT INTO alteracoes(id_tmp,estado_tmp) VALUES(OLD.id,NEW.estado);tem que ser o nome do campo,na tabela ALTERACOES, está id ou id_tmp? se eu fosse você trocava o if cria uma variável int e joga o valor da consulta CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW cont int BEGIN cont = select count(id_tmp) from alteracoes where id_tmp = OLD.id IF cont = 0 THEN .... assim fica mais rápido de onde você está pegando o NEW.estado? Compartilhar este post Link para o post Compartilhar em outros sites
M3nTaL 0 Denunciar post Postado Maio 9, 2008 sim desculpa..a tabela temporária é ALTERACOES(id_tmp,estado_tmp) a tabela MONITOR dispara o trigger e o valor NEW.estado é o valor actualizado dessa tabela com um respectivo OLD.id (k n pode ser alterado). Estou pegando o valor NEW.estado da tabela ESTADO. alterei o codigo e agora esta dando este erro: "Você tem um erro de sintaxe no seu SQL próximo a 'INT BEGIN cont = SELECT COUNT(id_tmp) FROM alteracoes WHERE id_tmp = OLD.id' na linha 4 " CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW cont INT BEGIN cont = SELECT COUNT(id_tmp) FROM alteracoes WHERE id_tmp = OLD.id; IF cont = 0 THEN INSERT INTO alteracoes(id_tmp,estado_tmp) VALUES(OLD.id,NEW.estado); ELSE UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id; END IF; END modificou; misterio... Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 9, 2008 esquece então aquela modificação. só troca no if, ao invés de 'not exists', deixa 'exists' e coloca o update e no else o insert. por acaso, o usuário vai poder alterar mais de um registro por vez? se puder, vai dar problema Compartilhar este post Link para o post Compartilhar em outros sites
M3nTaL 0 Denunciar post Postado Maio 9, 2008 pus assim entao: CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW BEGIN IF EXISTS(SELECT estado_tmp FROM alteracoes WHERE id_tmp = OLD.id) THEN UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id; ELSE INSERT INTO alteracoes(id_tmp,estado_tmp) VALUES(OLD.id,NEW.estado); END IF; END modificou; mas continua dando erro.. "Você tem um erro de sintaxe no seu SQL próximo a 'UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id' na linha 6 " Deve ser kk problema antes do BEGIN mas para mim ta td ok.. n consigo mm detectar..:( Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 9, 2008 a tabela MONITOR dispara o trigger e o valor NEW.estado é o valor actualizado dessa tabela com um respectivo OLD.id (k n pode ser alterado). Estou pegando o valor NEW.estado da tabela ESTADO. essa trigger tá no 'on update' da tabela MONITOR?? mas aí eu acho que não dá para pegar o campo 'estado' da tabela 'estado' Compartilhar este post Link para o post Compartilhar em outros sites
M3nTaL 0 Denunciar post Postado Maio 9, 2008 eu fiz desta forma e deu: CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id; mas eu queria o UPDATE e o INSERT no mm TRIGGER.. Compartilhar este post Link para o post Compartilhar em outros sites
NaPraia 12 Denunciar post Postado Maio 9, 2008 legal, já é um bom começo. Coloca aquele if que você tinha colocado mas sem o else e vê se funciona. Se não, tenta fazer da forma que eu tinha colocado, fazer a consulta contando se há registros gravados e joga numa variável. Bom, o comando não funcionou pq já estou a um tempo sem usar mysql e não lembro da nomenclatura correta. boa sorte. Compartilhar este post Link para o post Compartilhar em outros sites
M3nTaL 0 Denunciar post Postado Maio 9, 2008 CREATE TRIGGER modificou AFTER UPDATE ON monitor FOR EACH ROW BEGIN IF EXISTS(SELECT estado_tmp FROM alteracoes WHERE id_tmp = OLD.id) THEN UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id; END IF; END modificou; n esta a dar.."Você tem um erro de sintaxe no seu SQL próximo a 'UPDATE alteracoes SET estado_tmp = NEW.estado WHERE id_tmp = OLD.id' na linha 6 " Sera k o erro esta no k esta dentro d IF ? Compartilhar este post Link para o post Compartilhar em outros sites