Ir para conteúdo

POWERED BY:

Arquivado

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

Fr4nc0w

Trigger para impedir delete de registro caso possua referencias

Recommended Posts

Dae galera beleza? Feliz 2010 a todos.

 

Eu tenho um caso de referência recursiva, porém retirei a referência recursiva, pois vi que o MYSQL não se comportou muito bem com ela, mas preciso impedir o delete de um registro caso ele possua referência.

 

Devido a isso resolvi fazer um trigger que ao tentar deletar uma categoria, verifique se existe uma categoria filha, e se possuir impedir o delete, pois se essa categoria possuir outros itens, ela já é impedida de ser deletada.

 

Obs:"Caso tenham solucao pra referencia recursiva em MYSQL, também aceito."

 

A tabela: (Onde categoria Mãe é o id de uma outra categoria.)

 

CREATE TABLE IF NOT EXISTS `categoria` (
  `id_categoria` int(11) NOT NULL AUTO_INCREMENT,
  `titulo` varchar(80) NOT NULL,
  `ativa` varchar(255) DEFAULT 'N',
  `ordem` int(5) NOT NULL DEFAULT '0',
  `descricao` varchar(500) DEFAULT NULL,
  `categoriamae` int(11) DEFAULT '0', 
  PRIMARY KEY (`id_categoria`),
  KEY `fk_pessoa_categoria` (`id_pessoa`),
  KEY `FK_CATEGORIA_CATEGORIAMAE` (`categoriamae`)
)

 

Eu tentei, porém me confundi, se uso OLD para verificar o ID.

Também me perdi ao impedir o delete, eu devo fazer oq? return false?, pois nao tenho menor ideia do q fazer em relacao a isso.

 

O teste seria: "select count(id_categoria) into contagem from categoria where categoriamae = old.id_categoria"; Estou certo?

 

fiz um teste:

 

DELIMITER |

CREATE TRIGGER impedeDeleteCateg BEFORE DELETE ON categoria

  FOR EACH ROW BEGIN
  
	select count(id_categoria) INTO contagem from categoria where categoriamae = OLD.id_categoria
	
	IF @contagem > 0 THEN
		return false;	
	END IF;
	
    return true;
	
  END;
|
DELIMITER ;

porém travou meu MYSQL antes mesmo de inserir.

 

vlww e flww

 

caso tenham solucao pra referencia recursiva em MYSQL, também aceito.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Retira o return false que foi ele que provocou o erro e não sei te falar porque, mas ele já ferrou alguns procedimentos que desenvolvi há algum tempo. No lugar dele, você vai programar a recuperação do maior ID da tabela que teria o registro excluído e somará 1000 a este valor.

 

Tendo este valor, atribua o mesmo ao OLD.ID, o que provocará a exclusão de um registro que não existe, ou seja, não excluirá nenhum registro; lógico, isso deverá estar dentro de uma estrutura condicional IF THEN ELSE. Estou impossibilitado no momento de lhe fornecer um exemplo, mas acho que está bem claro.

 

Qualquer dúvida, continue o post.

 

Happy MySQL'ing!!

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.