Triệu chứng
Giả sử bạn tìm cách xóa dữ liệu khỏi một bảng và dữ liệu đang được tham chiếu ở các bảng khác trong Microsoft SQL Server 2016 và 2017. Nếu bạn khám phá kế hoạch thực hiện truy vấn, bạn có thể thấy kế hoạch sử dụng toán tử Kiểm tra Tham chiếu Khóa Ngoại. Trong trường hợp này, bạn có thể nhận được thông báo lỗi sau đây ngay cả khi hàng bị xóa không được tham chiếu trong bảng khác:
Thông báo 547, Mức 16, Trạng thái 0, Số Dòng
Câu lệnh DELETE xung đột với ràng buộc REFERENCE
Trạng thái
Microsoft đã xác nhận rằng đây là sự cố trong các sản phẩm của Microsoft được liệt kê trong mục "áp dụng cho".
Giải pháp
Sự cố này đã được khắc phục trong bản cập nhật tích lũy sau đây dành cho SQL Server:
Lưu ý Sự cố này đã được khắc phục trong Bản cập nhật tích lũy 6 dành cho SQL Server 2016 SP2.
Giới thiệu về các bản cập nhật tích lũy cho SQL Server:
Mỗi bản cập nhật tích lũy mới dành cho SQL Server chứa tất cả các bản sửa lỗi nóng và bản sửa lỗi bảo mật được tích hợp trong bản cập nhật tích lũy trước đó. Xem các bản cập nhật tích lũy mới nhất cho SQL Server:
Giải pháp thay thế
Để khắc phục sự cố này, hãy sử dụng một trong các phương pháp sau:
- Sử dụng mức tương thích dưới 130 để chạy truy vấn này.
- Thay đổi cấu trúc chỉ mục trên bảng tham chiếu.
Xem thêm thông tin
Bắt đầu mức tương thích cấu hình trong phạm vi cơ sở dữ liệu 130 Trong SQL Server 2016, kế hoạch thực thi truy vấn có thể sử dụng toán tử Kiểm tra Tham chiếu Khóa Ngoại, để xác minh xem một hàng trong bảng có được bất kỳ hàng nào trong bảng khác tham chiếu hay không thông qua các ràng buộc tính toàn vẹn tham chiếu. Bạn có thể sử dụng toán tử này nếu một bảng được tham chiếu bởi một lượng lớn các bảng ngoại. Trong toán tử này, SQL Server chọn một chỉ mục trong từng bảng tham chiếu để thực hiện kiểm tra này. Nếu bảng tham chiếu có một chỉ mục với nhiều cột khóa thì chẳng hạn như một số cột ở phần đầu không phải là một phần của khóa ngoại, nhưng một số cột khác lại là một phần của khóa ngoại. Điều này có thể dẫn đến việc SQL Server thực hiện kiểm tra không chính xác.
Chẳng hạn, hãy cân nhắc sơ đồ sau:
create table tpk (pk, int, constraint, cpk, primary key, clustered)
Create table tfk (a int, fk int, constraint, cfk, foreign key, references, tpk, index, IA, clustered(a,fk))
Sơ đồ như vậy có thể dẫn đến vấn đề này, nhưng nếu bạn thay đổi thứ tự của các cột trong chỉ mục ia thành (fk,a) thì sơ đồ sẽ không xảy ra.
Tham khảo
Tìm hiểu về thuật ngữ mà Microsoft dùng để mô tả các bản cập nhật phần mềm.