Bạn có thể sử dụng mã bên dưới để tắ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.
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
Điều này sử dụng sp_MSforeachtable
không có giấy tờ của Microsoft 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 - để tắt tất cả CHECK
các ràng buộc 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 | 0 | 0 | | ConstraintTest | chkValidEndDate | 0 | 0 | | ConstraintTest | chkTeamSize | 0 | 0 | | 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, 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 được bật vì is_disabled được đặt thành 0 .
Ví dụ 2 - Tắt các Ràng buộc
Bây giờ tôi sẽ vô hiệu hóa tất cả các ràng buộc:
EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK CONSTRAINT ALL"
Thông thường, bạn nên đảm bảo rằng mình đang sử dụng đúng cơ sở dữ liệu khi thực hiện những việc như thế này. Vì vậy, chúng tôi có thể thêm vào đoạn mã trên bằng cách chuyển sang cơ sở dữ liệu chính xác một cách rõ ràng:
USE Test; EXEC sp_MSforeachtable @command1="ALTER TABLE ? NOCHECK 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 .
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 | 1 | 1 | | ConstraintTest | chkValidEndDate | 1 | 1 | | ConstraintTest | chkTeamSize | 1 | 1 | | Occupation | chkJobTitle | 1 | 1 | +----------------+-----------------+---------------+------------------+
Vì vậy, tất cả các ràng buộc trong cơ sở dữ liệu đã bị vô hiệu hóa (vì is_disabled cột được đặt thành 1 đối với những ràng buộc đó).
Lưu ý rằng is_not_trusted cột cũng được đặt thành 1 . Đây là một cân nhắc quan trọng, đặc biệt nếu bạn định bật lại bất kỳ ràng buộc nào đã bị vô hiệu hóa của mình.
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 thông tin về cách khôi phục độ tin cậy khi kích hoạt lại các ràng buộc của bạn. Thông tin trong bài viết đó cũng áp dụng cho các khóa ngoại.
Tắt từng ràng buộc
Nếu bạn chỉ muốn vô hiệu hóa từng ràng buộc một, hãy xem Cách tắt ràng buộc KIỂM TRA trong SQL Server để biết ví dụ.