Obtendo ORA-00001 (restrição exclusiva violada) ao cometer?
-
24-09-2019 - |
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?
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