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

Cách vô hiệu hóa tất cả các ràng buộc về CHECK &khóa ngoại trong cơ sở dữ liệu trong SQL Server (Ví dụ T-SQL)

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ụ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL Server - phép nhân theo nhóm

  2. Tên cột hoặc số lượng giá trị được cung cấp không khớp với định nghĩa bảng

  3. Cách thay đổi thông số giá trị bảng

  4. không có sqljdbc_auth trong java.library.path

  5. Làm cách nào để mở rộng các giá trị được phân tách bằng dấu phẩy thành các hàng riêng biệt bằng SQL Server 2005?