Ir para conteúdo

POWERED BY:

Arquivado

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

Anderson007

Forcar Erro Trigger Before Delete

Recommended Posts

Olá pessoal,

 

Estou com problema no BEFORE DELETE da trigger aí em baixo.

 

Preciso forçar o erro do DELETE caso o IF > 0, e é nisso que não funciona.

 

Para o UPDATE e INSERT funciona legal. No DELETE, este trecho "SET NEW.id_ctb_lct = NULL ;" não consegue forçar o erro para não deletar. Já tentei "SET OLD.id_ctb_lct = NULL ;" e "SET @id_ctb_lct = NULL ;" e nada.

 

Agradeço antecipadamente pela atenção e espero que alguém tenha alguma solução.

 

CREATE TRIGGER trig03_ctb_lct BEFORE DELETE ON ctb_lct 
FOR EACH ROW 
BEGIN 

SET @trig01 = ( SELECT COUNT( comp_ctb_consist )
FROM ctb_consist
WHERE statu_ctb_consist = 'ATIVO'
AND status_ctb_consist = 'CONSISTIDO'
AND comp_ctb_consist = (
SELECT DATE_FORMAT( data, '%Y-%m' ) AS comp_data
FROM ctb_lct
WHERE id_ctb_lct = OLD.id_ctb_lct )
LIMIT 1 ) ;

IF( @trig01 >0 ) THEN 
SET NEW.id_ctb_lct = NULL ;

END IF ;
END 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se uma linha está sendo deletada qual o sentido de se alterar o valor de uma de suas colunas ?

 

A trigger é só de BEFORE DELETE ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

A Trigger apresenta uma condicional: se @trig01 >0 então não pode deletar a linha.

 

A Trigger está funcinando normalmente para BEFORE INSERT e UPDATE.

 

Uma explicação:

Em uma tabela digo se a Contabilidade de um Xperíodo está CONSISTIDA ou A CONSISTIR.

Na tabela de lançamentos contábeis, os lançamentos contábeis que estão contidos no Xperíodo que está CONSISTIDO não podem mais ser alterados ou deletados. Daí a necessidade do "Gatilho".

Compartilhar este post


Link para o post
Compartilhar em outros sites
A Trigger apresenta uma condicional: se @trig01 >0 então não pode deletar a linha.

 

Não conheço a linguagem mas não tem como gerar uma exceção ?

 

IF( @trig01 >0 ) THEN 
 call fail('período está CONSISTIDO!');
END IF ;

 

A Trigger está funcinando normalmente para BEFORE INSERT e UPDATE.

 

A instrução

BEFORE DELETE ON ctb_lct

faz com que a mesma só seja executada no DELETE.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado Motta!

 

Sua exceção

call fail('período está CONSISTIDO!');

funcionou muito bem!

 

De qual cartola você tirou o call fail? Hehe. Não encontrei nada no dev.mysql.com.

 

 

Portanto, o código ficou assim:

CREATE TRIGGER trig03_ctb_lct BEFORE DELETE ON ctb_lct 
FOR EACH ROW 
BEGIN 

SET @trig01 = ( SELECT COUNT( comp_ctb_consist )
FROM ctb_consist
WHERE statu_ctb_consist = 'ATIVO'
AND status_ctb_consist = 'CONSISTIDO'
AND comp_ctb_consist = (
SELECT DATE_FORMAT( data, '%Y-%m' ) AS comp_data
FROM ctb_lct
WHERE id_ctb_lct = OLD.id_ctb_lct )
LIMIT 1 ) ;

IF( @trig01 >0 ) THEN 
call fail('período está CONSISTIDO!');

END IF ;
END 

 

PS: há um TRIGGER similar para INSERT e outro para UPDATE que estão rodando perfeitamente.

 

Em vez de

SET NEW.id_ctb_lct = NULL ;

 

fica

 

call fail('período está CONSISTIDO!');

Compartilhar este post


Link para o post
Compartilhar em outros sites
De qual cartola você tirou o call fail? Hehe. Não encontrei nada no dev.mysql.com.

 

Procurei "gerar exceção mysql" ou "criar exceção mysql"

 

 

PS: há um TRIGGER similar para INSERT e outro para UPDATE que estão rodando perfeitamente.

 

 

Não repita o código, tente :

 

CREATE TRIGGER trigxx_ctb_lct BEFORE OR INSERT OR UPDATE OR DELETE ON ctb_lct 
FOR EACH ROW 
BEGIN 
...

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.