Không có cách nào đơn giản để báo cáo tất cả các vi phạm ràng buộc có thể xảy ra. Bởi vì khi Oracle vi phạm lần đầu tiên một ràng buộc, không thể đánh giá thêm, câu lệnh không thành công, trừ khi ràng buộc đó bị trì hoãn một trong những log errors
mệnh đề đã được đưa vào câu lệnh DML. Nhưng cần lưu ý rằng log errors
mệnh đề sẽ không thể nắm bắt tất cả các vi phạm ràng buộc có thể xảy ra, chỉ ghi lại lỗi đầu tiên.
Một trong những cách khả thi là:
- tạo
exceptions
bàn. Nó có thể được thực hiện bằng cách thực thiora_home/rdbms/admin/utlexpt.sql
kịch bản. Cấu trúc của bảng khá đơn giản; - vô hiệu hóa tất cả các ràng buộc bảng;
- thực thi các DML;
- bật tất cả các ràng buộc có
exceptions into <<exception table name>>
mệnh đề. Nếu bạn đã thực thiutlexpt.sql
script, tên của các ngoại lệ bảng sẽ được lưu trữ sẽ làexceptions
.
Bảng kiểm tra:
create table t1(
col1 number not null,
col2 number not null,
col3 number not null,
col4 number not null
);
Cố gắng thực thi một insert
tuyên bố:
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")
Tắt tất cả các ràng buộc của bảng:
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;
Cố gắng thực hiện insert
không thành công trước đó tuyên bố một lần nữa:
insert into t1(col1, col2, col3, col4)
values(1, null, 2, null);
1 rows inserted.
commit;
Bây giờ, hãy bật các ràng buộc của bảng và lưu trữ các ngoại lệ, nếu có, trong exceptions
bảng:
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;
Kiểm tra exceptions
bảng:
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
Hai ràng buộc đã bị vi phạm. Để tìm tên cột, chỉ cần tham khảo user_cons_columns
chế độ xem từ điển dữ liệu:
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
Truy vấn trên cung cấp cho chúng tôi tên cột và hàng của các bản ghi có vấn đề. Có sẵn rowids, sẽ không có vấn đề gì khi tìm những bản ghi gây ra vi phạm ràng buộc, sửa chúng và bật lại các ràng buộc một lần nữa.
Đây là tập lệnh đã được sử dụng để tạo alter table
câu lệnh để bật và tắt các ràng buộc:
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