2011-08-23 30 views
6

Tôi yêu các khóa ngoại, nhưng tôi đang gặp phải một vấn đề với chúng. Tôi có một chương trình chuyển đổi nơi tôi đang vô hiệu hóa các khóa ngoại bảng. Lý do tôi làm điều này là để tôi có thể khôi phục tất cả các bản ghi trong bảng chính, nhưng để lại các bảng khác phụ thuộc vào một bản ghi mà không bị phải phục hồi chúng mỗi lần vì chúng là HUGE.Bật khóa ngoài bằng Kiểm tra dữ liệu hiện có

Tôi đang sử dụng các lệnh này để vô hiệu hóa và kích hoạt lại các phím nước ngoài:

ALTER TABLE MyTable nocheck CONSTRAINT MyConstraint

ALTER TABLE MyTable ràng buộc kiểm tra MyConstraint

Tuy nhiên, sau khi tôi tái cho phép ràng buộc "Kiểm tra dữ liệu hiện tại khi tạo hoặc kích hoạt lại" vẫn được đặt thành Không. Tôi hiểu rằng nó được đặt thành Không vì tôi đã vô hiệu hóa ràng buộc, nhưng bằng cách thực hiện điều này, nó thay đổi lược đồ cơ sở dữ liệu của tôi. . Tôi nghĩ rằng điều này sẽ được coi là tái kích hoạt các ràng buộc và sẽ kiểm tra các dữ liệu hiện có, nhưng dường như không.

Không có cách nào để thay đổi điều này bằng lệnh ALTER TABLE? Tôi biết tôi có thể nếu tôi bỏ ràng buộc và tạo lại nó, nhưng tôi không định viết kịch bản để tạo lại mọi khóa ngoại mà tôi có và duy trì nó.

Tôi đang sử dụng SQL Server 2008 R2.

Trả lời

9

Để kích hoạt lại một hạn chế:

-- Enable the constraint 
ALTER TABLE MyTable 
WITH CHECK CHECK CONSTRAINT MyConstraint 
GO 

Note: bạn phải xác định CHECK hai lần để buộc một tấm séc rằng tất cả các thung lũng chính nước ngoài là hợp lệ.

KEY NƯỚC NGOÀI và KIỂM TRA khó khăn mà bị vô hiệu hóa được đánh dấu is_not_trusted.These có thể xem được trong sys.check_constraints và khung nhìn danh mục sys.foreign_keys. Điều này có nghĩa là ràng buộc không còn là do hệ thống xác minh cho tất cả các hàng của bảng nữa. Ngay cả khi bạn bật lại ràng buộc, nó sẽ không xác minh lại các hàng hiện có đối với bảng trừ khi bạn chỉ định tùy chọn WITH CHECK của ALTER TABLE. Chỉ định VỚI KIỂM TRA đánh dấu ràng buộc là đáng tin cậy một lần nữa.

Ref .: Guidelines for Disabling Indexes and Constraints

Như đã đề cập trong ý kiến ​​(đối với công cụ tìm kiếm), điều này tương ứng với

sys.foreign_keys.is_not_trusted

trong giao diện Danh mục

+0

Cảm ơn, bạn là một phao cứu sinh. –

+1

Đối với hồ sơ, vì tôi đã có một thời gian tìm kiếm ở nơi khác: "sys.foreign_keys.is_not_trusted" tương ứng với "Kiểm tra dữ liệu hiện có về tạo hoặc kích hoạt lại" trong hộp thoại Quản lý máy chủ SQL "Quan hệ khóa ngoài". – leqid

Các vấn đề liên quan