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

Cách vô hiệu hóa ràng buộc khóa ngoại trong SQL Server (Ví dụ T-SQL)

Nếu bạn rơi vào trường hợp cần vô hiệu hóa ràng buộc khóa ngoại trong SQL Server, dưới đây là cách thực hiện việc đó bằng Transact-SQL.

Điều này sẽ cho phép bạn nhập dữ liệu mà không bị hạn chế bởi khóa ngoại. Rõ ràng, bạn sẽ không làm điều này trừ khi bạn có lý do chính đáng để làm như vậy. Các khóa ngoại thực thi tính toàn vẹn của tham chiếu, vì vậy việc vô hiệu hóa chúng có khả năng tạo ra tất cả các loại vấn đề.

Ví dụ 1 - Vô hiệu hóa Ràng buộc khóa ngoài

Để vô hiệu hóa ràng buộc khóa ngoại, hãy sử dụng NOCHECK đối số trong ALTER TABLE tuyên bố.

Như thế này:

ALTER TABLE BandMember 
NOCHECK CONSTRAINT FK_BandMember_Musician; 

Mã này vô hiệu hóa ràng buộc khóa ngoại có tên là FK_BandMember_Musician .

Ví dụ 2 - Xem lại Ràng buộc

Chúng tôi có thể truy vấn sys.foreign_keys chế độ xem hệ thống để xác minh rằng ràng buộc của chúng tôi đã bị vô hiệu hóa:

SELECT 
  name AS 'Constraint',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Kết quả:

+--------------------------------+---------------+------------------+
| Constraint                     | is_disabled   | is_not_trusted   |
|--------------------------------+---------------+------------------|
| FK_BandMember_Band             | 0             | 0                |
| FK_BandMember_Musician         | 1             | 1                |
| FK_MembershipPeriod_BandMember | 0             | 0                |
+--------------------------------+---------------+------------------+

Trong trường hợp này, tôi đã chọn tất cả các ràng buộc khóa ngoại từ cơ sở dữ liệu hiện tại.

Chúng tôi có thể thấy rằng đây là cái duy nhất bị tắt (vì is_disabled của nó cột được đặt thành 1 ).

Bạn có thể nhận thấy rằng is_not_trusted cột cũng được đặt thành 1 . Điều này cho thấy rằng ràng buộc chưa được hệ thống xác minh.

Điều này có ý nghĩa, bởi vì chúng ta không còn có thể cho rằng ràng buộc đã kiểm tra tất cả dữ liệu. Thực tế là ràng buộc bị vô hiệu hóa có nghĩa là dữ liệu bây giờ có thể truy cập vào cơ sở dữ liệu mà không bị ràng buộc kiểm tra. Do đó, có khả năng tồn tại dữ liệu không hợp lệ trong cơ sở dữ liệu.

Nếu bạn cần kích hoạt lại ràng buộc, bạn sẽ có cơ hội khôi phục độ tin cậy của ràng buộc (bằng cách sử dụng WITH CHECK lựa chọn). Thao tác này sẽ kiểm tra tất cả các hàng hiện có trước khi kích hoạt ràng buộc.

Bạn cũng sẽ có tùy chọn không kiểm tra dữ liệu hiện có, nhưng điều này chỉ nên được thực hiện trong một số trường hợp hiếm hoi.

Đây là cùng một truy vấn nhưng có thêm một số cột để hiển thị các bảng và bảng được tham chiếu:

SELECT 
  name AS 'Constraint',
  OBJECT_NAME(parent_object_id) AS 'Table',
  OBJECT_NAME(referenced_object_id) AS 'Referenced Table',
  is_disabled,
  is_not_trusted
FROM sys.foreign_keys;

Kết quả:

+--------------------------------+------------------+---------------------+---------------+------------------+
| Constraint                     | Table            | Referenced Table    | is_disabled   | is_not_trusted   |
|--------------------------------+------------------+---------------------+---------------+------------------|
| FK_BandMember_Band             | BandMember       | Band                | 0             | 0                |
| FK_BandMember_Musician         | BandMember       | Musician            | 1             | 1                |
| FK_MembershipPeriod_BandMember | MembershipPeriod | BandMember          | 0             | 0                |
+--------------------------------+------------------+---------------------+---------------+------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cách chuyển đổi chuỗi thành ngày / giờ trong SQL Server bằng CAST ()

  2. Làm thế nào để tìm mức lương tối đa thứ ba hoặc thứ n từ bảng lương?

  3. Cách lấy danh sách các ràng buộc kiểm tra được bật / tắt trong cơ sở dữ liệu SQL Server - Hướng dẫn sử dụng SQL Server / TSQL Phần 86

  4. Giới hạn bộ nhớ trong SQL Server 2016 SP1

  5. Thiết lập cơ sở dữ liệu SQL Server cục bộ