Nếu bạn có CHECK
trong SQL Server hiện đang bị vô hiệu hóa, bạn có thể sử dụng mã bên dưới để kích hoạt lại nó.
Khi bạn bật CHECK
ràng buộc (hoặc ràng buộc khóa ngoại cho vấn đề đó), bạn có tùy chọn để chỉ định có kiểm tra bất kỳ dữ liệu hiện có nào trong bảng hay không.
Dưới đây là các ví dụ về mã để bật CHECK
ràng buộc, trong khi chỉ định từng tùy chọn khác nhau này.
Ví dụ 1 - Bật Ràng buộc bằng CÙNG KIỂM TRA
Đây là phương pháp được khuyến nghị để bật CHECK
của bạn ràng buộc (trừ khi bạn có lý do cụ thể để không sử dụng nó).
Dưới đây là một ví dụ về cách bật một ràng buộc có tên là chkJobTitle
:
ALTER TABLE Occupation WITH CHECK CHECK CONSTRAINT chkJobTitle;
Ở đây tôi nêu rõ ràng WITH CHECK
, yêu cầu SQL Server kiểm tra dữ liệu hiện có trước khi bật ràng buộc. Nếu bất kỳ dữ liệu nào vi phạm ràng buộc, ràng buộc sẽ không được bật và bạn sẽ gặp lỗi.
Điều này là tốt, vì nó thực thi tính toàn vẹn của dữ liệu.
Khi bạn tạo một CHECK
mới ràng buộc, đây là cài đặt mặc định. Tuy nhiên, khi bạn bật một ràng buộc hiện có (như chúng tôi đang làm ở đây), điều đó không cài đặt mặc định.
Ví dụ 2 - Bật Ràng buộc bằng WITH NOCHECK
Trong ví dụ này, ràng buộc được bật mà không cần kiểm tra dữ liệu hiện có:
ALTER TABLE Occupation WITH CHECK CHECK CONSTRAINT chkJobTitle;
Ở đây tôi nêu rõ ràng WITH NOCHECK
, thông báo cho SQL Server không kiểm tra dữ liệu hiện có. Điều này có nghĩa là ràng buộc sẽ được bật ngay cả khi bảng đã chứa dữ liệu vi phạm ràng buộc.
Đây là cài đặt mặc định khi bật một ràng buộc (nhưng không phải khi tạo một ràng buộc).
Một trong số ít lý do (có thể là lý do duy nhất) bạn sẽ sử dụng điều này là nếu bạn muốn giữ dữ liệu không hợp lệ trong cơ sở dữ liệu. Có lẽ bạn có một ngoại lệ duy nhất khi bạn phải nhập một hàng hoặc nhiều dữ liệu không hợp lệ, nhưng bạn yêu cầu tất cả dữ liệu trong tương lai phải tuân theo ràng buộc.
Tuy nhiên, vẫn có những rủi ro liên quan đến việc làm này. Đây là những gì Microsoft phải nói về điều này:
Chúng tôi khuyên bạn không nên làm điều này, trừ một số trường hợp hiếm hoi. Ràng buộc mới được đánh giá trong tất cả các bản cập nhật dữ liệu sau này. Bất kỳ vi phạm ràng buộc nào được ngăn chặn bởi
WITH NOCHECK
khi ràng buộc được thêm vào có thể khiến các bản cập nhật trong tương lai không thành công nếu chúng cập nhật các hàng có dữ liệu không tuân theo ràng buộc.
Vì vậy, sử dụng WITH NOCHECK
có thể gây ra sự cố sau này.
Ví dụ 3 - Bật Ràng buộc bằng Tùy chọn mặc định
Dưới đây là một ví dụ sử dụng tùy chọn mặc định:
ALTER TABLE Occupation CHECK CONSTRAINT chkJobTitle;
Ví dụ này tương đương với ví dụ trước. Bởi vì tôi không chỉ định có kiểm tra hay không, SQL Server giả định rằng tôi muốn WITH NOCHECK
.
Sử dụng VỚI NOCHECK làm mất đi sự tin cậy
Khi bạn bật một ràng buộc bằng cách sử dụng WITH NOCHECK
, một hệ quả mà bạn nên biết là SQL Server không còn tin tưởng vào ràng buộc đó nữa. Nó gắn cờ nó là không đáng tin cậy.
Bạn đã đọc đúng. Thực ra có một is_not_trusted
gắn cờ mà Máy chủ SQL đặt thành 1
khi bạn tắt CHECK
ràng buộc (có nghĩa là nó không đáng tin cậy) và cách duy nhất để đặt nó thành 0
(đáng tin cậy) là chỉ định WITH CHECK
khi bật lại ràng buộc. Sử dụng WITH NOCHECK
đừng cắt nó.
Điều này có ý nghĩa hoàn hảo. Rốt cuộc, sẽ bạn tin tưởng một ràng buộc chưa kiểm tra tất cả dữ liệu?
Bằng cách sử dụng WITH CHECK
, bạn đảm bảo rằng ràng buộc sẽ kiểm tra tất cả dữ liệu hiện có trước khi nó được kích hoạt. Cách duy nhất nó có thể được kích hoạt là nếu tất cả dữ liệu hiện có tuân theo ràng buộc. Khi nó đã kiểm tra tất cả dữ liệu hiện có, nó có thể được tin cậy.
Để biết thêm về điều này, hãy 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, nơi bạn có thể thấy is_not_trusted
thực tế cờ được chuyển đổi qua lại mỗi khi tôi tắt và bật lại CHECK
ràng buộc.