KB2861456 - KHẮC PHỤC: Vi phạm quyền truy cập trong nhân bản Tác nhân Phân phối trong SQL Server Transactional Replication

Áp dụng cho
SQL Server 2012 Developer SQL Server 2012 Enterprise SQL Server 2012 Standard SQL Server 2014 Developer - duplicate (do not use) SQL Server 2014 Enterprise - duplicate (do not use) SQL Server 2014 Standard - duplicate (do not use)

Triệu chứng

Giả sử bạn có môi trường Tái tạo Giao tác Microsoft SQL Server 2008 R2, SQL Server 2012 hoặc SQL Server 2014. Có nhiều phiên bản phân phối của SQL Server trong môi trường. Trong trường hợp này, vi phạm truy nhập có thể xảy ra và tác nhân phân phối sao nhân bản SQL Server gặp sự cố. Ngoài ra, một tệp kết xuất mini sẽ được tạo.

Giải pháp

Sau khi bạn áp dụng hotfix, tác tử sẽ tắt một cách dễ dàng thay vì gặp sự cố cùng với tệp dọc. Bạn có thể thêm một bước công việc bổ sung trong công việc Tác vụ Phân phối để tự động khởi động lại tác nhân khi tác nhân đã dừng và có trạng thái "lên lịch khởi động lại".

Để biết thêm thông tin về cách thêm một bước công việc bổ sung trong công việc Đại lý Phân phối, vui lòng tham khảo phần Thông tin Thêm.

Sự cố này được khắc phục lần đầu tiên trong bản cập nhật tích lũy tiếp theo của SQL Server.

Cập nhật tích lũy 1 cho SQL Server 2014 /en-us/help/2931693

Cập nhật tích lũy 9 cho SQL Server 2012 SP1 /en-us/help/2931078

Cập nhật tích lũy 11 cho SQL Server 2012 /en-us/help/2908007

Bản cập nhật tích lũy 9 cho SQL Server 2008 R2 SP2 /en-us/help/2887606

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:

      

Gói cập nhật hotfix cho SQL Server 2008 R2 Gói Dịch vụ 1Bản sửa lỗi cho sự cố này được phát hành lần đầu trong gói cập nhật hotfix cho SQL Server 2008 R2 Gói Dịch vụ 1.

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".

Xem thêm thông tin

Sau khi bạn áp dụng hotfix, hãy thêm tập lệnh sau vào công việc Tác lý Phân phối:DECLARE @JobID BINARY(16)
KHAI BÁO @AgentID số nguyên
DECLARE @command varchar(max)
KHAI BÁO JOBCUR CON TRỎ CHO SELECT Job.job_id, Agent.id FROM msdb.dbo.sysjobs AS Job
        INNER JOIN msdb.dbo.syscategories AS Cat ON Job.category_id = Cat.category_id
        INNER JOIN msdb.dbo.sysjobsteps AS Steps ON Job.job_id = Steps.job_id
        INNER JOIN distribution.dbo.MSdistribution_agents TÁC NHÂN NHƯ Job.job_id = Agent.job_id
        TRONG ĐÓ Job.name như '%Đặt mặt nạ văn bản để xác định công việc DB nhà xuất bản của bạn ở đây%' AND Cat.name = 'REPL-Distribution'
        GROUP BY Job.job_id, Agent.id
        HAVING COUNT(step_id) = 3
MỞ JobCur
FETCH NEXT FROM JobCur INTO @JobID, @AgentID
WHILE @@FETCH_STATUS = 0 BEGIN
        IF (@JobID không rỗng), BEGIN
                set @command = N'if (chọn 1 trạng thái chạy hàng đầu từ MSdistribution_history trong đó agent_id = ' + convert(varchar, N @AgentID)+ ', order by timestamp, desc) = 5
        raiserror(''Tác nhân đã được lên lịch để thử lại. Thực hiện khởi động lại ngay'',16,1)'
                EXEC msdb.dbo.sp_add_jobstep , '@database\_name=Ndistribution', '@step\_name=NCheck for retry', @step\_id=4, , @on\_fail\_action=4@on\_fail\_step\_id=1,@job\_id=@JobID@command=@command
                EXEC msdb.dbo.sp_update_jobstep @job\_id=@JobID, @step\_id=2, @on\_success\_action=4, @on\_success\_step\_id=4
        END
        FETCH TIẾP THEO TỪ JobCur VÀO @JobID, @AgentID;
END
ĐÓNG JobCur;
HỦY PHÂN BỔ JobCur;
GO