Tidak ada cara langsung untuk melaporkan semua kemungkinan pelanggaran batasan. Karena ketika Oracle tersandung pada pelanggaran pertama dari suatu kendala, tidak ada evaluasi lebih lanjut yang mungkin, pernyataan gagal, kecuali kendala itu ditangguhkan satu atau log errors
klausa telah dimasukkan dalam pernyataan DML. Tetapi perlu dicatat bahwa log errors
klausa tidak akan dapat menangkap semua kemungkinan pelanggaran batasan, cukup catat yang pertama.
Sebagai salah satu cara yang mungkin adalah:
- buat
exceptions
meja. Itu dapat dilakukan dengan menjalankanora_home/rdbms/admin/utlexpt.sql
naskah. Struktur tabelnya cukup sederhana; - nonaktifkan semua batasan tabel;
- jalankan DML;
- aktifkan semua batasan dengan
exceptions into <<exception table name>>
ayat. Jika Anda menjalankanutlexpt.sql
skrip, nama pengecualian tabel yang akan disimpan adalahexceptions
.
Tabel pengujian:
create table t1(
col1 number not null,
col2 number not null,
col3 number not null,
col4 number not null
);
Coba jalankan insert
pernyataan:
insert into t1(col1, col2, col3, col4)
values(1, null, 2, null);
Error report -
SQL Error: ORA-01400: cannot insert NULL into ("HR"."T1"."COL2")
Nonaktifkan semua batasan tabel:
alter table T1 disable constraint SYS_C009951;
alter table T1 disable constraint SYS_C009950;
alter table T1 disable constraint SYS_C009953;
alter table T1 disable constraint SYS_C009952;
Coba jalankan insert
yang sebelumnya gagal pernyataan lagi:
insert into t1(col1, col2, col3, col4)
values(1, null, 2, null);
1 rows inserted.
commit;
Sekarang, aktifkan batasan tabel dan simpan pengecualian, jika ada, di exceptions
tabel:
alter table T1 enable constraint SYS_C009951 exceptions into exceptions;
alter table T1 enable constraint SYS_C009950 exceptions into exceptions;
alter table T1 enable constraint SYS_C009953 exceptions into exceptions;
alter table T1 enable constraint SYS_C009952 exceptions into exceptions;
Periksa exceptions
tabel:
column row_id format a30;
column owner format a7;
column table_name format a10;
column constraint format a12;
select *
from exceptions
ROW_ID OWNER TABLE_NAME CONSTRAINT
------------------------------ ------- ------- ------------
AAAWmUAAJAAAF6WAAA HR T1 SYS_C009951
AAAWmUAAJAAAF6WAAA HR T1 SYS_C009953
Dua batasan telah dilanggar. Untuk mengetahui nama kolom, cukup lihat user_cons_columns
tampilan kamus data:
column table_name format a10;
column column_name format a7;
column row_id format a20;
select e.table_name
, t.COLUMN_NAME
, e.ROW_ID
from user_cons_columns t
join exceptions e
on (e.constraint = t.constraint_name)
TABLE_NAME COLUMN_NAME ROW_ID
---------- ---------- --------------------
T1 COL2 AAAWmUAAJAAAF6WAAA
T1 COL4 AAAWmUAAJAAAF6WAAA
Kueri di atas memberi kami nama kolom, dan baris data yang bermasalah. Memiliki rowid di tangan, seharusnya tidak ada masalah untuk menemukan catatan yang menyebabkan pelanggaran batasan, memperbaikinya, dan mengaktifkan kembali batasan sekali lagi.
Berikut adalah script yang telah digunakan untuk menghasilkan alter table
pernyataan untuk mengaktifkan dan menonaktifkan batasan:
column cons_disable format a50
column cons_enable format a72
select 'alter table ' || t.table_name || ' disable constraint '||
t.constraint_name || ';' as cons_disable
, 'alter table ' || t.table_name || ' enable constraint '||
t.constraint_name || ' exceptions into exceptions;' as cons_enable
from user_constraints t
where t.table_name = 'T1'
order by t.constraint_type