Khóa ngoại trở nên không đáng tin cậy sau khi chèn số lượng lớn


10

Trong máy chủ phiên bản SQL 2014 (12.0.2430.0 - chưa có SP1) với cơ sở dữ liệu ở chế độ tương thích 2012 (làm việc để chuyển sang 2014 ...) Tôi có một số đối tượng khóa ngoại được đánh dấu nhất quán như not trustedtrong cơ sở dữ liệu . Tôi đã bỏ và tạo lại chúng mà không có NOCHECKtùy chọn, nhưng trong vòng 5-10 phút chúng lại trở nên không đáng tin cậy và nếu tôi tạo một CREATEtập lệnh thì nó sẽ xuất hiện dưới dạng:

ALTER TABLE [dbo].[Points]  WITH NOCHECK 
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

Tập lệnh tạo đang được sử dụng là:

ALTER TABLE [dbo].[Points]
ADD  CONSTRAINT [FK_BadgeId] FOREIGN KEY([BadgeId])
REFERENCES [dbo].[Badge] ([Id])
GO

ALTER TABLE [dbo].[Points] CHECK CONSTRAINT [FK_BadgeId]
GO

Không có bản sao, không có công cụ của bên thứ ba và tôi đang theo dõi tất cả các câu lệnh DDL trên cơ sở dữ liệu để nó không phải là người dùng khác.

Tôi có thể kiểm tra các ràng buộc tốt (sử dụng WITH CHECK CHECKtrên từng) nhưng chúng vẫn trở nên không đáng tin cậy ngay sau đó. Chỉ các công việc bảo trì chạy là Ola vào đầu giờ sáng và điều này xảy ra suốt cả ngày.

Cập nhật:

Vì vậy, sau một vài dấu vết để thu hẹp các khả năng, có vẻ như nó BULK INSERTcó thể khiến cho việc FKtrở nên không đáng tin cậy. Câu hỏi msDN này nói rằng đây là một tuyến hợp lệ để khóa trở nên không tin cậy, đây là lần đầu tiên tôi nghe về nó.

Vì vậy, câu hỏi của tôi bây giờ là, có một chiến lược thay thế để sử dụng BULK INSERTcó thể duy trì is_trustedtrạng thái khóa ngoại ? Nó đang được thực thi trong bối cảnh một ứng dụng chạy vài lần mỗi giờ. Thay vào đó, tôi có thể yêu cầu các nhà phát triển bó các câu lệnh chèn của họ, nhưng tôi không muốn đưa ra tối hậu thư khi sử dụng BULK INSERTnếu tôi không phải làm vậy.

Câu trả lời:


9

Một BULK INSERTtừ ứng dụng của chúng tôi là nguyên nhân của các khóa ngoại không đáng tin cậy, như được xác nhận bởi một câu hỏi MSDN . Tương tự như BCP, bất cứ khi nào a BULK INSERTđược thực hiện thì khóa ngoại không được kiểm tra trong khi chèn, do đó làm cho nó không đáng tin cậy.

Như Kin đã đề cập, có các tập lệnh đơn giản có sẵn để tìm và sửa các khóa ngoại không đáng tin cậy, nhưng trong kịch bản của tôi, việc chèn đang diễn ra với tần suất khiến nỗ lực liên tục khắc phục sự cố này không đáng.

Và ypercube đã đề xuất sử dụng CHECK_CONSTRAINTS tùy chọn trong phần chèn số lượng lớn sẽ buộc các ràng buộc phải được tuân theo.

Tôi dự định xem xét với các nhà phát triển để đảm bảo rằng mỗi lần sử dụng BULK INSERTđều hợp lý về các hàng được chèn, nếu không nó sẽ phải là một cái gì đó để sống cùng.


2
Tôi đã sử dụng SqlBulkCopyvới hiệu ứng tương tự, nhưng có (ít nhất là bây giờ) một tùy chọn để thực hiện sao chép số lượng lớn trong khi vẫn kiểm tra các ràng buộc - có nghĩa là cơ sở sao chép số lượng lớn có thể thực hiện kiểm tra chính, rất có thể bcp có một số tùy chọn để bật cái đó. Bất cứ ai thực hiện chế độ không kiểm tra, mặc định cần phải được đấm vào mặt.
John
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.