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 | +--------------------------------+------------------+---------------------+---------------+------------------+