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

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

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 3 cách lấy tên ngày từ ngày trong SQL Server (T-SQL)

  2. datetime so với smalldatetime trong SQL Server:Sự khác biệt là gì?

  3. Thêm ràng buộc KIỂM TRA vào một bảng hiện có trong SQL Server (T-SQL)

  4. Gửi email có tệp đính kèm trong SQL Server (T-SQL)

  5. Các cột ngày tháng trong SQL-Server (MSSQL-JDBC 3.0) chạy trong Java 1.7.0 được truy xuất là 2 ngày trước đây