Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Nhiều ràng buộc trong bảng:Làm thế nào để nhận được tất cả các vi phạm?

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à:

  1. tạo exceptions bàn. Nó có thể được thực hiện bằng cách thực thi ora_home/rdbms/admin/utlexpt.sql kịch bản. Cấu trúc của bảng khá đơn giản;
  2. vô hiệu hóa tất cả các ràng buộc bảng;
  3. thực thi các DML;
  4. 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 thi utlexpt.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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mất điện với EMCLI

  2. oracle SQL cách xóa thời gian khỏi ngày tháng

  3. Làm cách nào để kết nối với Oracle DB từ xa với PL / SQL Developer?

  4. Nhầm lẫn InMemory DUPLICATE trong Oracle RAC

  5. Hộp công cụ hoàn hảo để phát triển PL / SQL là gì?