Khắc phục: Vi phạm truy nhập khi bạn thực hiện một quy trình được lưu trữ sử dụng con trỏ vào một biến bảng trong SQL Server

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 3138930
Triệu chứng
Giả sử rằng bạn tạo một quy trình được lưu trữ sử dụng con trỏ vào một biến bảng trong Microsoft SQL Server 2012 hoặc SQL Server 2014. Ngoài ra, quy trình được lưu trữ Cập Nhật bảng bằng cách sử dụng mộtVị trí hiện tại của tuyên bố cùng với con trỏ.

Ví dụ: quy trình được lưu trữ của bạn có thể giống như sau:
CREATE PROCEDURE dbo.usp_TestSP AS  BEGIN  DECLARE @TableVar TABLE (SomeInt INT NULL) INSERT @TableVar VALUES (NULL)  DECLARE @curInt INT, @newInt INT SET @newInt = 1  DECLARE ccc CURSOR LOCAL FOR SELECT SomeInt FROM @TableVar WHERE SomeInt IS NULL  OPEN ccc  FETCH NEXT FROM ccc INTO @curInt UPDATE @TableVar SET SomeInt = @newInt WHERE CURRENT OF cccCLOSE ccc  SELECT * FROM @TableVar END 

Khi bạn thực hiện quy trình được lưu trữ của bạn bằng cách sử dụng hệ thống sp_refreshsqlmodule lưu trữ thủ tục, một sự vi phạm truy nhập có thể xảy ra, và bạn có thể nhận được thông báo lỗi giống như sau:
TB 596, mức 21, trạm đậu 1Cannot tiếp tục thực hiện vì không ở trạm đậu kill. Thông báo lỗi 0, mức 20, trạm đậu 0A nghiêm trọng lỗi trên lệnh hiện hành. Kết quả, nếu có, phải được loại bỏ.

Trong trường hợp này, lỗi giống như sau được ghi vào Nhật ký lỗi SQL Server:
Ngày time.730 spid51 SqlDumpExceptionHandler: 51 quá trình tạo ra ngoại lệ nghiêm trọng là c0000005 EXCEPTION_ACCESS_VIOLATION. SQL Server kết thúc quá trình này.
date time.730 spid51 * *******************************************************************************
Ngày time.730 spid51 *
Ngày time.730 spid51 * Bắt đầu xếp CHỒNG đổ:
Ngày time.730 spid51 * ngày giờ spid 51
Ngày time.730 spid51 *
Ngày time.730 spid51 *
Ngày time.730 spid51 * địa chỉ ngoại lệ = 00007FFC270236D5 Module(sqllang+00000000005036D5)
Ngày time.730 spid51 * mã ngoại lệ = là c0000005 EXCEPTION_ACCESS_VIOLATION
Ngày time.730 spid51 * vi phạm truy nhập xảy ra đọc địa chỉ 0000006F00620074
Ngày time.730 spid51 * vào bộ đệm 136 byte -
Ngày time.730 spid51 * thực thi sp_refreshsqlmodule N'[dbo]. [usp_TestSP]'
Ngày time.730 spid51 *
Ngày time.730 spid51 *

Giải pháp

Thông tin Cập Nhật tích luỹ

Vấn đề này được khắc phục trong bản Cập Nhật sau:
Giới thiệu: cài đặt chuyên biệt bản Cập Nhật tích luỹ mới nhất cho SQL Server

Mỗi bản Cập Nhật tích luỹ mới cho SQL Server chứa tất cả các hotfix và tất cả các bản sửa lỗi bảo mật mà được đính kèm với bản Cập Nhật tích luỹ trước đó. Kiểm tra các bản Cập Nhật tích luỹ mới nhất cho SQL Server:
Tình trạng
Microsoft đã xác nhận rằng đây là sự cố trong sản phẩm của Microsoft được liệt kê trong phần "Áp dụng cho".
Tham khảo
Tìm hiểu về các thuật ngữ mà Microsoft sử dụng để mô tả bản cập nhật phần mềm.

Cảnh báo: Bài viết này được dịch tự động

Thuộc tính

ID Bài viết: 3138930 - Xem lại Lần cuối: 05/31/2016 06:56:00 - Bản sửa đổi: 4.0

Microsoft SQL Server 2012 Service Pack 3, Microsoft SQL Server 2012 Service Pack 2, Microsoft SQL Server 2014 Service Pack 1, Microsoft SQL Server 2014 Developer, Microsoft SQL Server 2014 Enterprise, Microsoft SQL Server 2014 Standard

  • kbqfe kbfix kbexpertiseinter kbsurveynew kbmt KB3138930 KbMtvi
Phản hồi