Ir para conteúdo

POWERED BY:

Arquivado

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

andersonol

Trigger para todas as colunas

Recommended Posts

Pois então, meu problema é simples, a solução nem tanto (pelo menos para mim)

 

Gostaria de saber como faço para criar um FOR EACH COLUMN dentro de uma trigger.

Preciso disso para montar uma auditória do sistema.

 

Tentei de duas maneiras:

 

-- O Exemplo abaixo não funciona, pois até onde sei não existe "FOR EACH COLUMN"
-- Porém acredito que este exemplo cumprirá a missão de exemplificar minha necessidade

DELIMITER ;
DROP TRIGGER IF EXISTS alteracao_preco ;
SHOW WARNINGS;
DELIMITER //

CREATE TRIGGER alteracao_preco BEFORE UPDATE ON estoque

FOR EACH ROW
BEGIN
   FOR EACH COLUMN
   BEGIN

       IF NEW.VALUE <> OLD.VALUE THEN

           INSERT INTO logcadastro 
              SET TABELA = "estoque", registro = LEFT( NEW.ECODIGO + " " + NEW.EDESCRICAO, 50 ), campo = NEW.ATTRIBUTE, 
              old_val = OLD.VALUE, new_val = NEW.VALUE,
              data = CURRENT_DATA, hora = CURRENT_TIME;

       END IF;		

   END;
END 
//

DELIMITER ;

 

-- Acredito que o exemplo abaixo se aproxima mais da solução adequada
-- Entretanto, "colname.OLD" irá gerar erro, pois "colname" é uma variável contendo o nome da coluna, e não a coluna em si!

DELIMITER ;
DROP TRIGGER IF EXISTS alteracao_preco ;
SHOW WARNINGS;
DELIMITER //

CREATE TRIGGER alteracao_preco BEFORE UPDATE ON estoque

FOR EACH ROW
BEGIN

   DECLARE done INT DEFAULT FALSE;
   DECLARE colname CHAR(16);
   DECLARE cur_columns CURSOR FOR SELECT column_name FROM information_schema.columns WHERE table_schema = 'farma0800' AND table_name = 'estoque' ;  
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

   OPEN cur_columns;

   read_loop: LOOP
       FETCH cur_columns INTO colname;

       IF done THEN
         LEAVE read_loop;
       END IF;

       IF colname.OLD <> colname.NEW THEN
        INSERT INTO logcadastro 
               SET TABELA = "estoque", registro = LEFT(NEW.ECODIGO + " " + NEW.EDESCRICAO,50), campo = colname, 
                   old_val = OLD.COLNAME, new_val = NEW.COLNAME, data = CURRENT_DATA, hora = CURRENT_TIME;
       END

   END LOOP;

   CLOSE cur_columns;

END;

 

Ficarei grato se alguém puder ajudar.

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.