Pergunta

Estamos recebendo um ORA-00001 (restrição exclusiva violada) em um trabalho em lote. No entanto, o erro ocorre quando uma confirmação é emitida, não no momento em que o registro ofensivo é inserido.

Perguntas:

  • Como é que a restrição exclusiva é verificada no Commit? (Existem algumas configurações que podemos usar para que a verificação ocorra no momento da inserção?)
  • Como podemos descobrir o SQL/registro ofensivo que leva à violação única de restrição?

Qualquer ajuda é apreciada!


Informações/perguntas adicionais:

A restrição "ofensiva" é marcada como imediata e não deferível. Isso pode ser substituído na transação?

Foi útil?

Solução

As restrições podem ser marcadas/definidas como diferidas. Nesse caso, as verificações de restrição podem ser "imediatas" ou "diferidas". Ao definir a restrição, você pode definir um valor padrão/inicial, initially immediate ou initially deferred. Quando definido como deferred A restrição é aplicada não até que você cometa a transação.
Você pode mudar o comportamento de restrições diferidas, por exemplo, via

set constraints all immediate;

Veja também: http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html

Outras dicas

As restrições podem ser definidas como diferidas, o que significa que elas são verificadas com comprometimento, não no momento da mudança de dados. Veja os 2 links a seguir:

http://www.oracle-base.com/articles/8i/constraintcheckingupdates.php

http://www.oracle.com/technology/oramag/oracle/03-nov/o63asktom.html

espero que ajude

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top