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

Cách bật Tất cả Ràng buộc Kiểm tra &Khóa ngoại cho Bảng trong SQL Server (Ví dụ T-SQL)

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 4 Mẹo để Thiết lập Cảnh báo Máy chủ SQL của Bạn

  2. Tránh 4 sai lầm DBA phổ biến này

  3. Máy chủ SQL SHOWPLAN_TEXT

  4. Cách chỉ định vị trí của tệp dữ liệu và tệp nhật ký khi tạo cơ sở dữ liệu trong SQL Server

  5. Mã VBA để thêm bảng được liên kết với khóa chính