Ir para conteúdo

POWERED BY:

Arquivado

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

M3nTaL

Problema com TRIGGERS

Recommended Posts

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

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

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

é 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

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

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

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

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

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

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

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

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

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

×

Informação importante

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