O deadlock ocorre porque são duas sessões tentando alterar a mesma
coisa. Não use essa pragma para fugir desta situação.
Esta lógica deve estar antes, em uma procedure, na que faz o DML na
tabela.

Uma trigger destas não deve ser usada, pois vc está alterando algo que
está sendo alterada.


Ricardo Portilho Proni
Coordenador de Bancos de Dados - Solvo S/A
- Oracle Database 10g Administrator Certified Professional (OCP)
- Microsoft Certified Professional (MCP)
- Microsoft Certified Technologt Specialist: SQL Server 2005 (MCTS)

http://portilho.profissionaloracle.com.br




Em Qua, 2008-10-29 às 20:23 -0200, Fabio escreveu:
> Boa noite colegas
> 
> Estou com um problema aqui, talvez os mais experientes possam me dar
> alguma dica.
> 
> Tenho uma tabela que possui um campo numérico (vlr_rateio). Então
> criei uma trigger nessa tabela que faz uma distribuição de um valor
> pelos itens nesse campo .
> Por exemplo, a tabela tem 3 linhas. Ao incluir, salvar ou excluir na
> tabela, eu pego um valor (150 por exemplo) e faço uma distribuição
> pelos itens da tabela (na 1ª linha recebe 20, na segunda 80 e na
> terceira 50).
> 
> É aí que eu recebo o erro de tabela mutante. Entendo que é uma
> situação meio sem lógica, pois a cada alteração eu chamaria a trigger
> que faz mais uma alteração, fazendo um loop infinito.
> 
> Só que acontece que essa distribuição acontece em uma situação
> específica (apenas quando altero algumas colunas). 
> Então eu fiz um "IF" na trigger para só chamar essa distribuição
> quando alteradas essas colunas. Assim, quando eu rodo o update da
> distribuição, não entra nesse IF, e não deveria dar problema.
> Sei que isso funciona, pois tenho o mesmo procedimento em outro SGBD.
> 
> Só que no Oracle não está funcionando, e acusa que a tabela é mutante.
> Pesquisando na internet, descobri a declaração "pragma
> autonomous_transaction", que acabou fazendo funcionar essa parte da
> distribuição (mas preciso dar um commit no final da trigger).
> Mas então está dando conflitos (deadlock) quando atualizo campos dessa
> tabela por uma outra trigger (da tabela pai).
> Acho que talvez por causa do commit, não sei.
> 
> Agradeço desde já qualquer ajuda ou sugestão.
> Abraços
> 
> Fabio Schunig
> 
> [As partes desta mensagem que não continham texto foram removidas]
> 
> 
> 
> 
> 
>  


[As partes desta mensagem que não continham texto foram removidas]

Responder a