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]