Ir para conteúdo

POWERED BY:

Arquivado

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

Marcos Junior

Trigger complicada

Recommended Posts

Tenho 3 tabelas. usuario, artigo e historico_artigo.

 

A tabela usuario se relaciona com a tabela artigo. Pois quero ter um relatório de todos os artigos postados pelo usuário.

 

A tabela historico_artigo tem exatamente a mesma estrutura da tabela artigo e contem todo o historico de postagens de cada artigo.

 

Cada vez que o usuario postar e alterar um artigo, altomaticamente a Trigger deve disparar um comando que vai salvar o histórico do conteúdo na tabela historico_artigo.

 

Minha dúvida cruel é saber como montar essa trigger.

 

Alguém me ajuda ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Criei esta trigger:

 

CREATE DEFINER=`root`@`localhost` TRIGGER `banco`.`disparador1` AFTER UPDATE ON banco.artigo FOR EACH ROW
BEGIN
    INSERT INTO historico_artigo
    SELECT * FROM artigo LIMIT 1;
END;

Mas ela tem um problema. Do jeito que essa trigger está, se haver muitos usuários fazendo inserção no banco, o sistema corre o risco de inserir artigos de diferentes usuários na tabela de histório.

 

O ideal é que ao disparar a trigger seja inserido no histórico o artigo que está sendo editado pelo usuário.

 

Alguém tem uma idéia melhor?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estava com uma situação bem parecida, aí fiz da seguinte forma:

Tenho as tabelas:

 

'ARTIGO' com os campos normais + id_usuario

'ARTIGO-HISTORICO' com os campos normais + id_usuario

 

Quando algum usuario insere dados na tabela ARTIGO ela pega aqueles dados e manda para a tabela ARTIGO-HISTORICO.

Por isso que na tabela ARTIGO eu tenho o campo id_usuario para os dados do usuário que inserir na tabela ARTIGO ir corretamente para a tabela ARTIGO-HISTORICO.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu estava com uma situação bem parecida, aí fiz da seguinte forma:

Tenho as tabelas:

 

'ARTIGO' com os campos normais + id_usuario

'ARTIGO-HISTORICO' com os campos normais + id_usuario

 

Quando algum usuario insere dados na tabela ARTIGO ela pega aqueles dados e manda para a tabela ARTIGO-HISTORICO.

Por isso que na tabela ARTIGO eu tenho o campo id_usuario para os dados do usuário que inserir na tabela ARTIGO ir corretamente para a tabela ARTIGO-HISTORICO.

 

A tua lógica está correta com certeza. Mas a questão é: como definir tudo isso na criação da trigger????

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo:

 

--
-- Estrutura da tabela `artigo`
--
CREATE TABLE IF NOT EXISTS `artigo` (
  `id_artigo` mediumint(9) NOT NULL AUTO_INCREMENT,
  `usuario_id_usuario` smallint(6) NOT NULL,
  `usuario_ip` tinytext NOT NULL,
  `data_hora` datetime NOT NULL
  PRIMARY KEY (`id_artigo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=181682;

--
-- Estrutura da tabela `artigo_historico`
--
CREATE TABLE IF NOT EXISTS `artigo_historico` (
  `id_artigo_historico` mediumint(9) NOT NULL AUTO_INCREMENT,
  `acao` enum('incluir','editar','apagar') NOT NULL,
  `id_artigo` mediumint(9) NOT NULL,
  `usuario_id_usuario` smallint(6) NOT NULL,
  `usuario_ip` tinytext NOT NULL,
  `data_hora` datetime NOT NULL,
  PRIMARY KEY (`id_artigo_historico`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=383231 ;

--
-- Gatilhos `artigo`
--

DROP TRIGGER IF EXISTS `jh_incluir`;
DELIMITER //
CREATE TRIGGER `jh_incluir` AFTER INSERT ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
	acao			       = 'incluir',
	id_artigo                      = NEW.id_artigo,
	usuario_id_usuario 	       = NEW.usuario_id_usuario,
	usuario_ip		       = NEW.usuario_ip,
	data_hora		       = NEW.data_hora
//
DELIMITER;

DROP TRIGGER IF EXISTS `jh_editar`;
DELIMITER //
CREATE TRIGGER `jh_editar` AFTER UPDATE ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
	acao			       = 'editar',
	id_artigo                      = NEW.id_artigo,
	usuario_id_usuario 	       = NEW.usuario_id_usuario,
	usuario_ip		       = NEW.usuario_ip,
	data_hora		       = NEW.data_hora
//
DELIMITER;

DROP TRIGGER IF EXISTS `jh_apagar`;
DELIMITER //
CREATE TRIGGER `jh_apagar` AFTER DELETE ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
	acao			       = 'apagar',
	id_artigo                      = OLD.id_artigo,
	usuario_id_usuario 	       = OLD.usuario_id_usuario,
	usuario_ip		       = OLD.usuario_ip,
	data_hora		       = OLD.data_hora;
//
DELIMITER;

 

Entendeu, 'ae'?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segue um exemplo:

 

--
-- Estrutura da tabela `artigo`
--
CREATE TABLE IF NOT EXISTS `artigo` (
  `id_artigo` mediumint(9) NOT NULL AUTO_INCREMENT,
  `usuario_id_usuario` smallint(6) NOT NULL,
  `usuario_ip` tinytext NOT NULL,
  `data_hora` datetime NOT NULL
  PRIMARY KEY (`id_artigo`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=181682;

--
-- Estrutura da tabela `artigo_historico`
--
CREATE TABLE IF NOT EXISTS `artigo_historico` (
  `id_artigo_historico` mediumint(9) NOT NULL AUTO_INCREMENT,
  `acao` enum('incluir','editar','apagar') NOT NULL,
  `id_artigo` mediumint(9) NOT NULL,
  `usuario_id_usuario` smallint(6) NOT NULL,
  `usuario_ip` tinytext NOT NULL,
  `data_hora` datetime NOT NULL,
  PRIMARY KEY (`id_artigo_historico`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=383231 ;

--
-- Gatilhos `artigo`
--

DROP TRIGGER IF EXISTS `jh_incluir`;
DELIMITER //
CREATE TRIGGER `jh_incluir` AFTER INSERT ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
	acao			       = 'incluir',
	id_artigo                      = NEW.id_artigo,
	usuario_id_usuario 	       = NEW.usuario_id_usuario,
	usuario_ip		       = NEW.usuario_ip,
	data_hora		       = NEW.data_hora
//
DELIMITER;

DROP TRIGGER IF EXISTS `jh_editar`;
DELIMITER //
CREATE TRIGGER `jh_editar` AFTER UPDATE ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
	acao			       = 'editar',
	id_artigo                      = NEW.id_artigo,
	usuario_id_usuario 	       = NEW.usuario_id_usuario,
	usuario_ip		       = NEW.usuario_ip,
	data_hora		       = NEW.data_hora
//
DELIMITER;

DROP TRIGGER IF EXISTS `jh_apagar`;
DELIMITER //
CREATE TRIGGER `jh_apagar` AFTER DELETE ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
	acao			       = 'apagar',
	id_artigo                      = OLD.id_artigo,
	usuario_id_usuario 	       = OLD.usuario_id_usuario,
	usuario_ip		       = OLD.usuario_ip,
	data_hora		       = OLD.data_hora;
//
DELIMITER;

 

Entendeu, 'ae'?

 

 

Não, não entendí. O gatilho tem que inserir no histórico exatamente o registro que o usuário X editou. Desse jeito que você fez, ele corre o risco de inserir qualquer registro de qualquer usuário.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não entendí. O gatilho tem que inserir no histórico exatamente o registro que o usuário X editou. Desse jeito que você fez, ele corre o risco de inserir qualquer registro de qualquer usuário.

Eu acho que se você prestar atenção você evita afirmar algo que não sabe.

 

 

DROP TRIGGER IF EXISTS `jh_editar`;
DELIMITER //
CREATE TRIGGER `jh_editar` AFTER UPDATE ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
        acao                           = 'editar',
        id_artigo                      = NEW.id_artigo,
        usuario_id_usuario             = NEW.usuario_id_usuario,
        usuario_ip                     = NEW.usuario_ip,
        data_hora                      = NEW.data_hora
//
DELIMITER;

Se você definir um trigger depois de um UPDATE, o registro inserido na tabela histórico será aquele editado pelo usuário;

 

Um TRIGGER ou gatilho é um objeto de banco de dados, associado a uma tabela, definido para ser disparado, respondendo a um evento em particular. Tais eventos são os comandos da DML (Data Manipulation Language): INSERT, REPLACE, DELETE ou UPDATE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O exemplo do Vagner está correto.

 

Marcos, o evento INSERT será executado apenas depois de atualizado a tabela.

 

Qualquer dúvida veja o manual oficial do MySQL: link externo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não, não entendí. O gatilho tem que inserir no histórico exatamente o registro que o usuário X editou. Desse jeito que você fez, ele corre o risco de inserir qualquer registro de qualquer usuário.

Eu acho que se você prestar atenção você evita afirmar algo que não sabe.

 

 

DROP TRIGGER IF EXISTS `jh_editar`;
DELIMITER //
CREATE TRIGGER `jh_editar` AFTER UPDATE ON `artigo`
 FOR EACH ROW INSERT INTO artigo_historico SET
        acao                           = 'editar',
        id_artigo                      = NEW.id_artigo,
        usuario_id_usuario             = NEW.usuario_id_usuario,
        usuario_ip                     = NEW.usuario_ip,
        data_hora                      = NEW.data_hora
//
DELIMITER;

Se você definir um trigger depois de um UPDATE, o registro inserido na tabela histórico será aquele editado pelo usuário;

 

Um TRIGGER ou gatilho é um objeto de banco de dados, associado a uma tabela, definido para ser disparado, respondendo a um evento em particular. Tais eventos são os comandos da DML (Data Manipulation Language): INSERT, REPLACE, DELETE ou UPDATE.

Obrigado pela ajuda. Mas quero dizer-te que não sou analfabeto.

Da próxima vez use mais moderadamente suas palavras.

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.