sql >> Database teknologi >  >> RDS >> Oracle

Hvordan kommer man uden om en unik overtrædelse af begrænsninger?

En mulighed ville være at bruge instead of udløser. Denne løsning kræver dog, at du omdøber dine tabeller og opretter visninger med de navne, de havde. På den måde påvirker du ikke applikationslogikken, men det kan påvirke den overordnede ydeevne, så den bør testes ordentligt.

Ikke desto mindre er det ikke en særlig god idé at bruge triggere til at ændre forkert applikationslogik. Jeg forstår din knibe, at vi nogle gange skal finde løsninger på eksisterende problemer, men det gør det ikke rigtigt.

Under alle omstændigheder, nedenfor et simpelt eksempel, som du kan anvende på din logik

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.

Nu opretter vi en instead of trigger

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.

Med denne trigger vil ethvert forsøg på at overtræde begrænsningen gøre opdateringen af ​​værdien mulig i den endelige tabel.

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



  1. Spørg de to byer i STATION med de korteste og længste CITY-navne,

  2. Hvordan indsætter man i samme tabel i MySQL?

  3. Android:Bruger SSL/HTTPS til at forbinde med PHP til databasen og bruge POST/GET

  4. Ukendt kolonne i 'have-sætning'