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

Cách bật Ràng buộc KIỂM TRA trong SQL Server (Ví dụ T-SQL)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tiện ích mở rộng SQLSRV hoạt động với PHP, vì MSSQL không được dùng nữa?

  2. SQL Server’s Tương đương với Sleep ():Câu lệnh WAITFOR

  3. Ràng buộc kiểm tra chồng chéo phạm vi ngày

  4. Phiên bản phụ trợ không được hỗ trợ để thiết kế sơ đồ hoặc bảng cơ sở dữ liệu

  5. Tại sao truy vấn Microsoft SQL Server 2012 mất vài phút so với JDBC 4.0 nhưng lại mất vài phút trong Management Studio?