Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana cara mengatasi pelanggaran batasan unik?

Salah satu opsi adalah menggunakan instead of pemicu. Namun, solusi ini mengharuskan Anda untuk mengganti nama tabel Anda dan membuat tampilan dengan nama yang mereka miliki. Dengan begitu Anda tidak memengaruhi logika aplikasi, namun dapat memengaruhi kinerja secara keseluruhan, sehingga harus diuji dengan benar.

Namun demikian, menggunakan pemicu untuk mengubah logika aplikasi yang salah bukanlah ide yang bagus. Saya memahami kesulitan Anda bahwa terkadang kami perlu menemukan solusi untuk masalah yang ada, tetapi itu tidak memperbaikinya.

Bagaimanapun, di bawah ini contoh sederhana yang dapat Anda terapkan pada logika Anda

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.

Sekarang kita membuat instead of pemicu

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.

Dengan pemicu ini, setiap upaya untuk melanggar batasan akan memungkinkan pembaruan nilai di tabel final.

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle SQL:Memilih data dan nama partisi dari tabel dan memotong partisi

  2. Oracle Tidak Setara Operator

  3. Struktur dan Jenis Blok Oracle PLSQL

  4. Spesifikasi Oracle atau SQL? :Potong tabel dengan batasan kunci asing

  5. MASUKKAN KE PILIH DARI AKSES KE ORACLE