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 cơ sở dữ liệu hiện tại trong SQL Server.
Khi bạn bật CHECK
hoặc ràng buộc khóa ngoại, bạn có tùy chọn kiểm tra dữ liệu hiện có trong bảng trước khi kích hoạt ràng buộc. Làm điều này cho phép bạn xác minh xem có bất kỳ hiện tại nào vi phạm ràng buộc hay không. Để thực hiện việc kiểm tra này, hãy sử dụng WITH CHECK
trong mã, nếu không, hãy sử dụng WITH NOCHECK
.
Mã mẫu
Đây là cách bật tất cả CHECK
và các ràng buộc khóa ngoại trong cơ sở dữ liệu. Ví dụ đầu tiên kiểm tra dữ liệu hiện có, ví dụ thứ hai thì không.
Với Kiểm tra (khuyến nghị):
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
Không có séc:
EXEC sp_MSforeachtable "ALTER TABLE ? WITH NOCHECK CHECK CONSTRAINT ALL"
Bạn cũng có thể cung cấp tên đối số một cách rõ ràng (@command1
) nếu bạn thích (bạn sẽ nhận được cùng một kết quả).
Với séc:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
Không có séc:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
Những ví dụ này sử dụng sp_MSforeachtable
(không có giấy tờ) thủ tục được lưu trữ. Thủ tục này cho phép bạn thực hiện các tác vụ đối với từng bảng trong cơ sở dữ liệu. Vì vậy, nó là hoàn hảo cho nhiệm vụ của chúng tôi ở đây - để bật tất cả CHECK
và các ràng buộc khóa ngoại trong cơ sở dữ liệu hiện tại.
Dưới đây là một ví dụ mà tôi thực hiện việc này và sau đó 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 và các ràng buộc khóa ngoại trong cơ sở dữ liệu, để xem chúng có được bật hay tắt 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 | 1 | 1 | +----------------+-----------------+---------------+------------------+
Vì vậy, hiện có bốn CHECK
ràng buộc ràng buộc trong cơ sở dữ liệu, cho hai bảng khác nhau.
Chúng ta có thể thấy rằng tất cả các ràng buộc đều bị vô hiệu hóa vì is_disabled được đặt thành 1 .
Ngoài ra, tất cả chúng đều không đáng tin cậy, bởi vì is_not_trusted cũng được đặt thành 1 .
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 bằng cách sử dụng WITH CHECK
đối số:
EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
Luôn luôn là một ý kiến hay để đảm bảo rằng bạn đang sử dụng đúng cơ sở dữ liệu khi thực hiện loại việc này. Vì vậy, chúng tôi có thể sửa đổi mã bằng cách chuyển sang cơ sở dữ liệu chính xác trước tiên:
USE Test; EXEC sp_MSforeachtable "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL"
Trong trường hợp này, tôi chuyển sang cơ sở dữ liệu có tên là Kiểm tra trước khi thực hiện thủ tục được lưu trữ.
Ví dụ 3 - Kiểm tra kết quả
Sau khi chạy đoạn mã trên, bây giờ tôi sẽ 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 | +----------------+-----------------+---------------+------------------+
Vì vậy, tất cả các ràng buộc trong cơ sở dữ liệu hiện đã được kích hoạt (vì is_disabled cột được đặt thành 0 cho tất cả các ràng buộc).
Chúng ta cũng có thể thấy rằng is_not_trusted cột cũng được đặt thành 0 . Điều này có nghĩa là ràng buộc được tin cậy. Nó đáng tin cậy, vì chúng tôi có nó để kiểm tra tất cả dữ liệu hiện có trước khi được bật.
Nếu tôi đã sử dụng WITH NOCHECK
, các ràng buộc sẽ vẫn không đáng tin cậy (tức là
is_not_trusted
của chúng cờ sẽ được đặt thành
1
). Điều này là do cơ sở dữ liệu có thể chứa dữ liệu vi phạm một (hoặc nhiều) các ràng buộc (dữ liệu không hợp lệ có thể đã vào cơ sở dữ liệu trong khi các ràng buộc bị vô hiệu hóa).
Trong những trường hợp hiếm hoi, bạn có thể cần giữ dữ liệu không hợp lệ trong cơ sở dữ liệu. Trong những trường hợp như vậy, ràng buộc sẽ cần phải được duy trì không đáng tin cậy, bởi vì dữ liệu hiện có sẽ không vượt qua kiểm tra ban đầu và do đó, ràng buộc sẽ không thể được kích hoạt trừ khi nó sử dụng WITH NOCHECK
.
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 để biết ví dụ chi tiết về chuyển đổi giữa đáng tin cậy và không đáng tin cậy khi tắt và bật lại một ràng buộc.
Bật các ràng buộc một cách riêng lẻ
Nếu bạn chỉ muốn bật từng ràng buộc một, hãy 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.