2015-09-29 21 views
6

Chúng tôi có một tình huống kỳ lạ trên một bảng trong một cơ sở dữ liệu Oracle, nơi thả một kết quả cột trong việc thay đổi các giá trị mặc định của cột khác. Đây là kịch bản.Tại sao Oracle DROP COLUMN này thay đổi giá trị mặc định của một cột khác?

Tôi có bàn của tôi với một số dữ liệu mẫu trong đó:

select * from SAMPLE_TABLE ; 

ID          BUSINESS_KEY 
---------------------------------------- --------------- 
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb     1 
c0dabf78-d9ca-4072-832e-aeb618c7ed14     2 

tôi thêm cột type1 với một hạn chế kiểm tra (TYPE1_VAL1 hoặc TYPE1_VAL2) và một giá trị mặc định TYPE1_VAL2:

alter table SAMPLE_TABLE add TYPE1 varchar(10) default 'TYPE1_VAL2' not null check(TYPE1 in ('TYPE1_VAL1', 'TYPE1_VAL2')); 

Table altered. 

Tôi thấy rằng giá trị mặc định (TYPE1_VAL2) được lấp đầy một cách chính xác trong:

select * from SAMPLE_TABLE ; 

ID          BUSINESS_KEY TYPE1 
---------------------------------------- --------------- ---------- 
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb     1 TYPE1_VAL2 
c0dabf78-d9ca-4072-832e-aeb618c7ed14     2 TYPE1_VAL2 

tôi thêm một cột type2 với một hạn chế kiểm tra (TYPE2_VAL1 hoặc TYPE2_VAL2) và một giá trị mặc định TYPE2_VAL2:

alter table SAMPLE_TABLE add TYPE2 varchar(15) default 'TYPE2_VAL2' not null check(TYPE2 in ('TYPE2_VAL1', 'TYPE2_VAL2')); 

Table altered. 

Và một lần nữa thấy rằng giá trị mặc định (TYPE2_VAL2) là chính xác:

SYSTEM(SYSTEM) @ DB_USER > select * from SAMPLE_TABLE ; 

ID          BUSINESS_KEY TYPE1  TYPE2 
---------------------------------------- --------------- ---------- --------------- 
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb     1 TYPE1_VAL2 TYPE2_VAL2 
c0dabf78-d9ca-4072-832e-aeb618c7ed14     2 TYPE1_VAL2 TYPE2_VAL2 

Và bây giờ là phần lạ. Khi tôi thả cột đầu tiên, có vẻ như để áp dụng các giá trị mặc định từ cột thả vào các cột còn lại:

ALTER TABLE SAMPLE_TABLE DROP COLUMN TYPE1; 

Table altered. 

select * from SAMPLE_TABLE ; 

ID          BUSINESS_KEY TYPE2 
---------------------------------------- --------------- --------------- 
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb     1 TYPE1_VAL2 
c0dabf78-d9ca-4072-832e-aeb618c7ed14     2 TYPE1_VAL2 

Vì vậy, nơi trước type2 cột chứa TYPE2_VAL2, tất cả của một đột ngột sau khi thả nó chứa TYPE1_VAL2. Nó giống như ràng buộc kiểm tra của cột bị loại bỏ được di chuyển đến cột này.

Điều này xảy ra trên môi trường thử nghiệm của chúng tôi nơi chúng tôi đang chạy Cơ sở dữ liệu Oracle 11g Bản phát hành 11.2.0.4.0 - Sản xuất 64 bit trên Linux.

Trên phiên bản CentOS/Oracle XE địa phương của chúng tôi, chúng tôi không có vấn đề này.

Bất kỳ ý tưởng nào có thể gây ra điều này và cách chúng tôi có thể ngăn điều này xảy ra. Đây có phải là do thiết kế/lỗi/lỗi của chúng tôi không?

+5

Mùi như bạn cần mở SR. –

+1

Điều này làm việc cho tôi trên 11.2.0.4 trên Solaris. Trông giống như một lỗi rất cụ thể. Giống như Luc M nói, có thể bạn sẽ cần phải mở một SR. (Ngoài ra, tôi không chắc tại sao một người nào đó đã bỏ phiếu để đóng câu hỏi này - đây là câu hỏi hoàn toàn hợp lệ cho trang web này.) –

+2

Có thể là một điều gì đó liên quan đến thực tế là các giá trị mặc định hiện được lưu trữ dưới dạng siêu dữ liệu (mặc dù điều đó không được nêu rõ ràng trong [tài liệu] (http://download.oracle.com/docs/cd/B28359_01/server.111/b28310/tables006.htm#sthref1856), tôi nghĩ nó được ngụ ý) nếu bạn tạo giá trị mặc định bằng ràng buộc null. Tôi đoán là có một lỗi trong phiên bản của bạn làm xáo trộn siêu dữ liệu khi cột bị bỏ, để cột thứ hai của bạn trỏ vào siêu dữ liệu giá trị mặc định cho cột đầu tiên. – Boneist

Trả lời

4

Đây là lỗi của Oracle.

Nó được kích hoạt bằng cách thêm cột có cả ràng buộc NOT NULL và giá trị DEFAULT vào bảng hiện có.

Để thêm cột nhanh chóng, Oracle 11g lưu trữ giá trị mặc định trong từ điển dữ liệu. Oracle gọi đây là "tối ưu hóa cột thêm".

Điều này nhanh hơn việc ghi giá trị mặc định vào mỗi hàng của bảng. Công cụ truy vấn sau đó được yêu cầu thay thế bất kỳ NULL nào trong hàng của bảng bằng giá trị mặc định từ từ điển dữ liệu. Thật không may có một số lỗi liên quan đến điều này.Trân dường như là một thể hiện của:

17325413 cột Drop với giá trị mặc định và không định nghĩa NULL kết thúc lên với dữ liệu cột giảm chạm đĩa dẫn đến tham nhũng

Bạn có thể kiểm tra các cột đã được thêm vào như thế này:

select owner, object_name, name 
from dba_objects, col$ 
where bitand(col$.PROPERTY,1073741824)=1073741824 
and object_id=obj#; 

Trong trường hợp này, chúng tôi bị lỗi khác trả lại kết quả không chính xác cho số SELECT FOR UPDATE.

Chúng tôi đặt tham số _add_col_optim_enabled=FALSE để tắt "tối ưu hóa" này. Ngoài ra, bạn có thể nâng cấp lên phiên bản Oracle sau này, nơi các lỗi này được giải quyết.

Việc nâng cấp hoặc đặt thông số ở trên sẽ không sửa bảng hiện tại của bạn, bảng bị hỏng. Bạn phải tạo lại bảng đó.

Các vấn đề liên quan