sql >> Databasteknik >  >> RDS >> Oracle

Hur kan man komma runt en unik överträdelse av begränsningar?

Ett alternativ skulle vara att använda instead of utlösare. Den här lösningen kräver dock att du byter namn på dina tabeller och skapar vyer med de namn de hade. På så sätt påverkar du inte applikationslogiken, men det kan påverka den övergripande prestandan, så den bör testas ordentligt.

Ändå är det ingen bra idé att använda triggers för att ändra fel programlogik. Jag förstår din situation att vi ibland behöver hitta lösningar på befintliga problem, men det gör det inte rätt.

Hur som helst, nedan ett enkelt exempel som du kan tillämpa 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 skapar vi en instead of utlösa

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 denna trigger kommer varje försök att bryta mot begränsningen att göra uppdateringen av värdet möjlig i sluttabellen.

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. Index flera kolumner med Ruby on Rails

  2. MySQL-fel 1093 - Kan inte ange måltabell för uppdatering i FROM-satsen

  3. Hur man skapar länkad server MySQL

  4. Hur återställer man primärnyckeln för en tabell?