Khi bạn cố gắng nhập dữ liệu vào một bảng có CHECK
được bật đầy đủ , bạn sẽ chỉ thành công nếu dữ liệu không vi phạm ràng buộc đó. Nếu bạn cố gắng nhập dữ liệu không hợp lệ, thao tác sẽ không thành công và có lỗi.
Nhưng điều gì sẽ xảy ra nếu bạn rơi vào tình huống mà bạn thực sự phải chèn dữ liệu sẽ vi phạm CHECK
hạn chế? Có lẽ ràng buộc không còn được áp dụng hoặc có thể bạn có một ngoại lệ trong đó một hàng được phép bỏ qua ràng buộc. Dù bằng cách nào, bạn sẽ không thể nhập bất kỳ thứ gì ngoài quy tắc của ràng buộc.
Nếu bạn thấy mình trong tình huống này, bạn luôn có thể vô hiệu hóa ràng buộc. Dưới đây là cách thực hiện điều đó bằng Transact-SQL.
Ví dụ 1 - Tắt Ràng buộc KIỂM TRA
Để tắt CHECK
ràng buộc, sử dụng NOCHECK
đối số trong ALTER TABLE
tuyên bố.
Như thế này:
ALTER TABLE Occupation NOCHECK CONSTRAINT chkJobTitle;
Mã này vô hiệu hóa một ràng buộc có tên là chkJobTitle .
Ví dụ 2 - Xem lại Ràng buộc KIỂM TRA
Chúng tôi có thể truy vấn sys.check_constraints
chế độ xem hệ thống để xác minh rằng ràng buộc của chúng tôi đã bị vô hiệu hóa:
SELECT name, is_disabled, is_not_trusted, definition FROM sys.check_constraints;
Kết quả:
+-----------------+---------------+------------------+----------------------------------------+ | name | is_disabled | is_not_trusted | definition | |-----------------+---------------+------------------+----------------------------------------| | chkPrice | 0 | 0 | ([Price]>(0)) | | chkValidEndDate | 0 | 0 | ([EndDate]>=[StartDate]) | | chkTeamSize | 0 | 0 | ([TeamSize]>=(5) AND [TeamSize]<=(20)) | | chkJobTitle | 1 | 1 | ([JobTitle]<>'Digital Nomad') | +-----------------+---------------+------------------+----------------------------------------+
Trong trường hợp này, tôi đã chọn tất cả CHECK
các ràng buộc từ cơ sở dữ liệu hiện tại.
Chúng tôi có thể thấy rằng đây là cái duy nhất bị tắt (vì is_disabled của nó cột được đặt thành 1 ).
Bạn có thể nhận thấy rằng
is_not_trusted
cột cũng được đặt thành
1
. Điều này cho thấy rằng CHECK
ràng buộc chưa được hệ thống xác minh cho tất cả các hàng.
Nói cách khác, chúng ta không còn có thể cho rằng ràng buộc đã kiểm tra tất cả dữ liệu. Thực tế là ràng buộc bị vô hiệu hóa có nghĩa là dữ liệu bây giờ có thể truy cập vào cơ sở dữ liệu mà không bị ràng buộc kiểm tra. Do đó, có khả năng tồn tại dữ liệu không hợp lệ trong cơ sở dữ liệu.
Nếu bạn cần bật lại CHECK
ràng buộc, bạn sẽ có cơ hội khôi phục độ tin cậy của ràng buộc (bằng cách sử dụng WITH CHECK
lựa chọn). Thao tác này sẽ kiểm tra tất cả các hàng hiện có trước khi bật ràng buộc.
Bạn cũng sẽ có tùy chọn không kiểm tra dữ liệu hiện có, nhưng điều này chỉ nên được thực hiện trong một số trường hợp hiếm hoi.
Xem những gì bạn nên biết về VỚI NOCHECK khi bật Ràng buộc KIỂM TRA trong SQL Server để minh họa về mức độ tin cậy bị ảnh hưởng như thế nào, tùy thuộc vào cách bạn kích hoạt lại ràng buộc.