sql >> Database >  >> RDS >> Oracle

Hoe een unieke beperkingsschending te omzeilen?

Een optie zou zijn om instead of . te gebruiken trekker. Deze oplossing vereist echter dat u uw tabellen hernoemt en weergaven maakt met de namen die ze hadden. Op die manier heeft u geen invloed op de toepassingslogica, maar het kan wel van invloed zijn op de algehele prestaties, dus het moet goed worden getest.

Desalniettemin is het geen goed idee om triggers te gebruiken om verkeerde toepassingslogica te wijzigen. Ik begrijp uw hachelijke situatie dat we soms oplossingen moeten vinden voor bestaande problemen, maar dat maakt het nog niet goed.

Hoe dan ook, hieronder een eenvoudig voorbeeld dat u kunt toepassen op uw logica

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 maken we een 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.

Met deze trigger maakt elke poging om de beperking te schenden de update van de waarde mogelijk in de finaletafel.

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. ImportError:Geen module met de naam 'MySQL'

  2. JPA + Hibernate:een beperking definiëren met ON DELETE CASCADE

  3. Hoe maak je een tabel met een externe sleutelbeperking in SQL Server - SQL Server / TSQL-zelfstudie, deel 66

  4. Oracle SQL unieke beperking A naar B, B naar A