Bạn có thể sử dụng mã bên dưới để bật tất cả CHECK
và các ràng buộc khóa ngoại cho một bảng cụ thể trong SQL Server.
Khi bạn bật một ràng buộc trong SQL Server, bạn cần quyết định xem nó có nên kiểm tra bất kỳ dữ liệu hiện có nào hay không. Đây là một cân nhắc quan trọng nếu bảng đã chứa dữ liệu, vì dữ liệu hiện có đó có thể vi phạm các quy tắc của ràng buộc.
Tuyên bố mẫu
Dưới đây là hai câu lệnh mẫu cho thấy sự khác biệt giữa việc kiểm tra dữ liệu hiện có và không kiểm tra nó khi bạn bật các ràng buộc.
Để kiểm tra dữ liệu hiện có, hãy sử dụng WITH CHECK
trong câu lệnh của bạn khi bật các ràng buộc, nếu không, hãy sử dụng WITH NOCHECK
.
Với séc:
ALTER TABLE TableName WITH CHECK CHECK CONSTRAINT ALL
Không có Kiểm tra:
ALTER TABLE TableName WITH NOCHECK CHECK CONSTRAINT ALL
Chỉ cần thay thế TableName
với tên của bảng áp dụng.
Dưới đây là một ví dụ mà tôi thực hiện việc này và kiểm tra kết quả.
Ví dụ 1 - Xem lại các Ràng buộc
Đầu tiên, tôi sẽ xem nhanh CHECK
hiện tại các ràng buộc trong cơ sở dữ liệu, để xem liệu chúng có được kích hoạt hay vô hiệu hóa hay không.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Kết quả:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Vì vậy, hiện có bốn CHECK
các ràng buộc trong cơ sở dữ liệu, ba trong số đó dành cho ConstraintTest
bảng.
Chúng ta có thể thấy rằng tất cả các ràng buộc cho bảng đều bị tắt vì is_disabled được đặt thành 1 .
Chúng ta cũng có thể thấy rằng is_not_trusted cột được đặt thành 1 cho những ràng buộc này. Điều này có nghĩa là họ không được tin cậy. Chúng không thể đáng tin cậy khi chúng bị vô hiệu hóa vì dữ liệu không hợp lệ có thể vào cơ sở dữ liệu mà không bị kiểm tra. Thông tin thêm về điều này bên dưới.
Ràng buộc khác (đối với bảng khác) đã được kích hoạt và đáng tin cậy (nhưng chúng ta có thể bỏ qua bảng / ràng buộc đó trong bài viết này).
Ví dụ 2 - Bật các Ràng buộc bằng CÙNG KIỂM TRA
Bây giờ tôi sẽ bật tất cả các ràng buộc cho ConstraintTest
bảng:
ALTER TABLE ConstraintTest WITH CHECK CHECK CONSTRAINT ALL;
Vậy là xong.
Bây giờ, hãy chạy cùng một truy vấn từ ví dụ đầu tiên để xem kết quả.
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Kết quả:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 0 | 0 | | ConstraintTest | chkValidEndDate | 0 | 0 | | ConstraintTest | chkTeamSize | 0 | 0 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Cả ba ràng buộc cho ConstraintTest bảng hiện đã được kích hoạt và đáng tin cậy.
Chúng được tin cậy vì tôi đã sử dụng WITH CHECK
trong tuyên bố của tôi. Nếu không, tôi sẽ có một kết quả khác, như bạn sẽ thấy bên dưới.
Bằng cách sử dụng WITH CHECK
, Tôi có thể chắc chắn rằng mọi dữ liệu hiện có trong bảng trên thực tế đều tuân theo các ràng buộc.
Ví dụ 3 - Bật các Ràng buộc bằng cách sử dụng WITH NOCHECK
Bây giờ tôi sẽ bật lại các ràng buộc bằng cách sử dụng WITH CHECK
để chúng tôi có thể thấy điều này ảnh hưởng đến kết quả như thế nào.
Nhưng trước tiên, tôi cần phải tắt chúng:
ALTER TABLE ConstraintTest NOCHECK CONSTRAINT ALL;
Kiểm tra xem chúng có bị vô hiệu hóa không:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Kết quả:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Vì vậy, chúng lại bị vô hiệu hóa.
Bây giờ hãy bật lại chúng bằng cách sử dụng WITH NOCHECK
:
ALTER TABLE ConstraintTest WITH NOCHECK CHECK CONSTRAINT ALL;
Kiểm tra lại:
SELECT OBJECT_NAME(parent_object_id) AS 'Table', name AS 'Constraint', is_disabled, is_not_trusted FROM sys.foreign_keys UNION SELECT OBJECT_NAME(parent_object_id), name, is_disabled, is_not_trusted FROM sys.check_constraints;
Kết quả:
+----------------+-----------------+---------------+------------------+ | Table | Constraint | is_disabled | is_not_trusted | |----------------+-----------------+---------------+------------------| | ConstraintTest | chkPrice | 0 | 1 | | ConstraintTest | chkValidEndDate | 0 | 1 | | ConstraintTest | chkTeamSize | 0 | 1 | | Occupation | chkJobTitle | 0 | 0 | +----------------+-----------------+---------------+------------------+
Chúng ta có thể thấy rằng các ràng buộc đã được kích hoạt thành công, nhưng lần này chúng vẫn không đáng tin cậy.
Các ràng buộc không đáng tin cậy vì chúng không kiểm tra bất kỳ dữ liệu hiện có nào trước khi được bật.
Vì vậy, điều quan trọng ở đây là, nếu bạn muốn các ràng buộc của mình được tin cậy, hãy đảm bảo sử dụng WITH CHECK
khi bật chúng.
Bật các ràng buộc riêng lẻ
Nếu bạn không muốn bật tất cả các ràng buộc cùng một lúc, bạn có thể bật chúng một cách riêng lẻ. Điều này cũng có thể hữu ích nếu bạn cần bật tất cả các ràng buộc, nhưng bạn cần sử dụng các cài đặt khác nhau (ví dụ:WITH CHECK
cho một số và WITH NOCHECK
cho những người khác).
Xem Cách bật Ràng buộc KIỂM TRA trong SQL Server và Cách bật khóa ngoại trong SQL Server.