Foreign Keys
Jest taki event, który potrafi pokazać w trace, które wyrażenia powodują
"złapanie" błędu z "integrity constraints". Pasowałoby to znaleźć.
Czasem włączenie takiego eventu jest bardzo przydatne.
Ophaned child records
A oto przykład jak włączyć foreign key na tabeli która ma
"orphaned child records":
20:03:08 SQL> alter table norm2 add constraint norm2_fk
20:03:13 2 foreign key (id) references norm1(id)
20:03:19 3 initially deferred;
alter table norm2 add constraint norm2_fk
*
ERROR at line 1:
ORA-02298: cannot validate (JXA.NORM2_FK) - parent keys not found
20:03:24 SQL> alter table norm2 add constraint norm2_fk
20:11:20 2 foreign key (id) references norm1(id)
20:11:23 3 enable novalidate;
Table altered.
20:11:37 SQL>
Teraz można sprawdzić jak wyglądają te constrainty. Nowy
klucz obcy jest właczony. Sprawdzanie ma miejsce, ale
jest caly czas w stanie "NOT VALIDATED".
20:32:04 SQL> /
CONSTRAINT_NAME STATUS DEFERRED VALIDATED
------------------------------ -------- --------- -------------
[...]
NORM2_FK ENABLED IMMEDIATE NOT VALIDATED
20:32:42 SQL> list
1 select constraint_name,status,deferred,validated
2* from user_constraints where table_name = 'NORM2'
Właczenie nie jest możliwe jak widać na poniższym listingu:
20:32:46 SQL> alter table norm2 modify constraint norm2_fk
enable validate;
alter table norm2 modify constraint norm2_fk enable validate
*
ERROR at line 1:
ORA-02298: cannot validate (JXA.NORM2_FK) - parent keys not found
20:35:30 SQL>
Można jednak sprawdzić, które wiersze są przyczyną łamania zależności
klucza obcego. Najpierw tworzymy table exceptions,
potem uruchamiamy jeszcze raz powyższe polecenie z klauzulą
"EXCEPTIONS INTO":
20:38:54 SQL> @?/rdbms/admin/utlexcpt
Table created.
20:38:57 SQL> alter table norm2 modify constraint norm2_fk
20:39:08 2 enable validate exceptions into exceptions;
alter table norm2 modify constraint norm2_fk
*
ERROR at line 1:
ORA-02298: cannot validate (JXA.NORM2_FK) - parent keys not found
20:42:10 SQL> select * from exceptions;
ROW_ID OWNER TABLE_NAME CONSTRAINT
------------------ ---------- ---------- ----------
AAAA9oAADAAABwDAAC JXA NORM2 NORM2_FK
20:42:17 SQL>
Przyjemne, prawda? Można w ten sposob dokładnie dojść
które wiersze psują integralność tabeli i włączyć więzy.
© 25.11.2004 Jerzy Kędra