Atualizar campo antes de deletar registro

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pessoal, to tentando criar uma gamibarra mesmo, mas é coisa temporária, até o problema ser realmente resolvido, rsrs.

Mas o caso é o seguinte: em nossa base de dados temos uma trigger que verifica se determinado campo possui alguma informação antes de deletar o mesmo. Caso tenha, ele dispara uma exception informando que o registro não pode ser excluído, pois o campo está preenchido.

O que quero fazer é antes de deletar a linha, atualizar esse campo para NULL.
É possível?

Obrigado.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Hehehehhe, gostei da sinceridade.
Só acho que não existe muito isso de "temporário". Sempre é temporariamente longa a solução substituta.
Mas enfim...

Não, você não pode numa trigger de ON DELETE evitar o delete fazendo tratamento para só colocar NULL em um campo. Só se evita o DELETE com o exception, mas aí dá erro na transação, e pode causar erro na aplicação.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Mas na verdade eu não quero EVITAR o delete.
Quero que ele realmente aconteça.

Porém, essa trigger que está evitando o delete está funcionando perfeitamente, é uma trigger do sistema mesmo.

Essa gambiarra em si é o seguinte: O campo que a trigger do sistema testa pode ter diversas informações. Esse campo não sendo nulo, a trigger gera uma exception impedindo a exclusão. Até ai perfeito, tem que ser assim mesmo.

O que quero fazer é que quando for deletar a linha e nesse campo contiver o valor 'X', esse campo seja atualizado para NULL, de forma que a trigger do sistema não impeça o delete.

Isso que estou tentando achar uma alternativa.

Vlw.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Hmmmm.
A alternativa mais coerente seria alterar a trigger do sistema e permitir o delete desse tipo de situação.

Mas pelo que estou entendendo você poderia deletar TUDO, sempre.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Pois é, mas a trigger de sistema eu não quero mexer pois é do fornecedor do ERP, aí fica complicado para nós mexermos.
A minha idéia era fazer outra trigger.
Porém, estive lendo que no Oracle 10G não temos como definir a prioridade de execução de triggers do mesmo tipo. Como ambas seriam before delete, eu não teria como garantir que a minha fosse executada primeiro.

Acho que não vou consegui fazer o que estava pensando, rsrs.

Mas obrigado pelas respostas.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

O que eu não estou entendendo é:
Se você verica se campoX está preenchido para setar o mesmo campo como nulo, então você quer poder deletar TODOS registros dessa tabela.
Ou não é isso, é olhar um campo e colocar nulo outro????
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Noctifero escreveu:O que eu não estou entendendo é:
Se você verica se campoX está preenchido para setar o mesmo campo como nulo, então você quer poder deletar TODOS registros dessa tabela.
Ou não é isso, é olhar um campo e colocar nulo outro????
é isso, eu verifico se o campo X está preenchido com determinado valor.

Digamos que esse campo possa ter os valores (A,B,C ou D). Se o valor do campo for 'A' eu atualizo para null afim de permitir a exclusão. Caso não, deixa o campo como está que a trigger do sistema ira impedir a exclusão.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Relendo novamente o tópico vi que não havia mencionado o teste que precisava fazer, por isso ficava difícil de compreender a minha necessidade.
Desculpe pela confusão, mas agora consegui me expressar com clareza, rsrs.

Vlw.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Odeio ter que dizer isso, mas odeio mais ainda não ter solução, nem que seja "alternativa".
Crie outra trigger na mesma tabela, "ON DELETE", e se o campo for 'A', lance a exceção, TEMPORARIAMENTE, :P.
jks1903
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 188
Registrado em: Qui, 04 Fev 2010 8:08 am

Noctifero escreveu:Odeio ter que dizer isso, mas odeio mais ainda não ter solução, nem que seja "alternativa".
Crie outra trigger na mesma tabela, "ON DELETE", e se o campo for 'A', lance a exceção, TEMPORARIAMENTE, :P.
O problema é que já existe uma trigger BFORE DELETE nessa tabela.
Andei pesquisando e vi que o Oracle 10g não suporta ordenação de triggers, ou seja, não tenho como garantir que a trigger que eu criar seja executada antes da trigger que já existe.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Tinha me confundido novamente sobre permitir e excluir. Falei achando que você queria impedir a exclusão. Mas você quer apenas permitir num caso específico que a trigger principal impede.
Realmente criar outra trigger before delete não funciona.
Suponho que apos inser ou updade você também não possa fazer essa verificação e setar este campo como NULL, visto ele ser necessário para o sistema.
É...Melhor desistir de gambiarra então. :P
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes