Fórum Alterar trigger dentro de outra trigger #503024
01/12/2014
0
Tenho a seguinte situação: tenho uma tabela de estoque de produtos (ESTOQUE_PROD) e uma tabela de estoque de matéria-prima (ESTOQUE_MAT), preciso que ao atualizar qualquer uma das tabelas a outra tbm atualize, ex: ao atualizar o estoque de um produto atualize tbm o estoque da matéria-prima referente ao produto e vice versa.
Para isso criei uma trigger em cada tabela, quando atualizo a tabela ESTOQUE_PROD a trigger atualiza tbm a tabela ESTOQUE_MAT e vice versa, porém, isso faz com que o sistema fique em looping, um atualizando o outro sempre.
Tive a ideia de desabilitar a trigger antes de fazer o update e habilitar depois do update, porem o firebird não aceita a palava chave ALTER dentro da trigger.
Segue a trigger da tabela de ESTOQUE_PROD:
Alguém sabe o que devo fazer?
Para isso criei uma trigger em cada tabela, quando atualizo a tabela ESTOQUE_PROD a trigger atualiza tbm a tabela ESTOQUE_MAT e vice versa, porém, isso faz com que o sistema fique em looping, um atualizando o outro sempre.
Tive a ideia de desabilitar a trigger antes de fazer o update e habilitar depois do update, porem o firebird não aceita a palava chave ALTER dentro da trigger.
Segue a trigger da tabela de ESTOQUE_PROD:
CREATE TRIGGER ESTOQUE_ATU_MATP FOR ESTOQUE_PROD
ACTIVE AFTER UPDATE POSITION 0
AS
begin
--desabilitar a trigger da tabela ESTOQUE_MAT para não entrar em looping
alter trigger estoque_atu_prod inactive;
--atualizar estoque de matéria-prima
update ESTOQUE_MAT set quant = new.q1 where referencia = new.referencia;
--habilitar a trigger da tabela materiapest
alter trigger estoque_atu_prod active;
end
endAlguém sabe o que devo fazer?
Everton Carlesso
Curtir tópico
+ 0
Responder
Posts
03/12/2014
Hugo
Boa tarde amigo,
Tente usar variáveis de contexto, algo como...
numa trigger vc preenche a variavel assim:
e na outra vc testa se a variavel de contexto está preenchida
acredito que dessa forma é possível resolver o seu problema...
nesses links tem uma explicação melhor de como funciona as variáveis de contexto...
[url]http://www.firebirdsql.org/refdocs/langrefupd20-get-context.html[/url]
[url]http://www.firebirdsql.org/refdocs/langrefupd25-intfunc-set_context.html[/url]
espero ter ajudado...
t+
Tente usar variáveis de contexto, algo como...
numa trigger vc preenche a variavel assim:
rdb$set_context('USER_TRANSACTION', 'NAO_EXECUTA_TRIGGER', 1); e na outra vc testa se a variavel de contexto está preenchida
if (rdb$get_context('USER_TRANSACTION', 'NAO_EXECUTA_TRIGGER') is null) then
--alguma coisa
acredito que dessa forma é possível resolver o seu problema...
nesses links tem uma explicação melhor de como funciona as variáveis de contexto...
[url]http://www.firebirdsql.org/refdocs/langrefupd20-get-context.html[/url]
[url]http://www.firebirdsql.org/refdocs/langrefupd25-intfunc-set_context.html[/url]
espero ter ajudado...
t+
Responder
Gostei + 0
05/12/2014
Everton Carlesso
Boa tarde Hugo. obrigado pela resposta, já consegui resolver, fiz mais ou menos desse jeito que vc disse, mas não usei essa variavel de contexto, usei um campo na tabela mesmo para verificar se pode alterar ou não.
Responder
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)