Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie umgeht man eine Unique Constraint-Verletzung?

Eine Möglichkeit wäre, instead of zu verwenden Abzug. Diese Lösung erfordert jedoch, dass Sie Ihre Tabellen umbenennen und Ansichten mit den Namen erstellen, die sie hatten. Auf diese Weise wird die Anwendungslogik nicht beeinträchtigt, es könnte sich jedoch auf die Gesamtleistung auswirken, daher sollte es ordnungsgemäß getestet werden.

Trotzdem ist es keine gute Idee, Trigger zu verwenden, um eine falsche Anwendungslogik zu ändern. Ich verstehe Ihre missliche Lage, dass wir manchmal Problemumgehungen für bestehende Probleme finden müssen, aber das macht es nicht richtig.

Wie auch immer, unten ein einfaches Beispiel, das Sie auf Ihre Logik anwenden können

SQL> create table t ( c1 number primary key , c2 varchar2(1) ) ;

Table created.

SQL> alter table t rename to tbl_t ;

Table altered.

SQL>  create view t as ( select c1 , c2 from tbl_t ) ;

View created.

Jetzt erstellen wir einen instead of auslösen

SQL> create or replace trigger tr_v_t
  2  instead of insert
  3  on t
  4  for each row
  5  declare
  6    pk_violation_exception exception;
  7    pragma exception_init(pk_violation_exception, -00001);
  8  begin
  9    insert into tbl_t (c1,c2)
 10    values ( :new.c1,:new.c2 );
 11    exception
 12      when pk_violation_exception then
 13        dbms_output.put_line('ora-00001 (pk_violation_exception) captured');
 14        update tbl_t
 15        set c2   = :new.c2
 16        where c1 = :new.c1 ;
 17* end;
SQL> /

Trigger created.

Mit diesem Trigger wird jeder Versuch, die Einschränkung zu verletzen, die Aktualisierung des Werts in der Abschlusstabelle ermöglichen.

SQL> select * from t ;

no rows selected

SQL> insert into t values ( 1 , 'A' ) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> insert into t values ( 2, 'B' ) ;

1 row created.

SQL> commit ;

Commit complete.

SQL> insert into t values ( 2, 'C' ) ;
ORA-00001 (pk_violation_exception) captured

1 row created.

SQL> select * from tbl_t ;

        C1 C
---------- -
         1 A
         2 C