Symptomy
Załóżmy, że masz środowisko replikacji transakcyjnej Microsoft SQL Server 2008 R2, SQL Server 2012 lub SQL Server 2014. W środowisku istnieje wiele wystąpień dystrybucji programu SQL Server. W takiej sytuacji może wystąpić naruszenie zasad dostępu, a Agent dystrybucji replikacji programu SQL Server ulegnie awarii. Ponadto jest generowany plik zrzutu mini.
Rozwiązanie
Po zastosowaniu tej poprawki Agent zostanie bezpiecznie zamknięty zamiast awarii wraz z plikiem zrzutu. Możesz dodać kolejny krok zadania agenta dystrybucyjnego, aby ponownie uruchomić agenta, gdy Agent został zatrzymany, a jego stan jest zaplanowany do ponownego uruchomienia. Aby uzyskać więcej informacji na temat dodawania dodatkowego etapu zadania w zadaniu agenta dystrybucji, zapoznaj się z sekcją więcej informacji. Ten problem został po raz pierwszy rozwiązany w poniższej zbiorczej aktualizacji programu SQL Server.
Zbiorcza aktualizacja 1 dla programu SQL Server 2014 /en-us/help/2931693
Zbiorcza aktualizacja 9 dla programu SQL Server 2012 z dodatkiem SP1 /en-us/help/2931078
Zbiorcza aktualizacja 11 dla programu SQL Server 2012 /en-us/help/2908007
Zbiorcza aktualizacja 9 dla programu SQL Server 2008 R2 z dodatkiem SP2 /en-us/help/2887606
Każda nowa Zbiorcza aktualizacja programu SQL Server zawiera wszystkie poprawki i wszystkie poprawki zabezpieczeń uwzględnione w poprzedniej aktualizacji zbiorczej. Zapoznaj się z najnowszymi aktualizacjami zbiorczymi dla programu SQL Server:
Pakiet aktualizacji poprawek dla programu SQL Server 2008 R2 z dodatkiem Service Pack 1Poprawka dotycząca tego problemu została wydana po raz pierwszy w pakiecie aktualizacji poprawek dla programu SQL Server 2008 R2 z dodatkiem Service Pack 1.
Stan
Firma Microsoft potwierdziła, że jest to problem występujący w produktach firmy Microsoft wymienionych w sekcji "dotyczy".
Więcej informacji
Po zastosowaniu tej poprawki Dodaj poniższy skrypt do zadania agenta dystrybucji:DECLARE @JobID BINARY(16)DECLARE @AgentID intDECLARE @command varchar(max)DECLARE JobCur CURSOR FOR 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 AS Agent ON Job.job_id = Agent.job_id WHERE Job.name like '%Put Text Mask To Identify Your Publisher DB Jobs Here%' AND Cat.name = 'REPL-Distribution' GROUP BY Job.job_id, Agent.id HAVING COUNT(step_id) = 3OPEN JobCurFETCH NEXT FROM JobCur INTO @JobID, @AgentIDWHILE @@FETCH_STATUS = 0 BEGIN IF (@JobID is not NULL) BEGIN set @command = N'if (select top 1 runstatus from MSdistribution_history where agent_id = ' + convert(varchar, @AgentID)+ N' order by timestamp desc) = 5 raiserror(''Agent was scheduled for retry. Performing restart now'',16,1)' EXEC msdb.dbo.sp_add_jobstep @job_id=@JobID, @database_name=N'distribution', @step_name=N'Check for retry', @step_id=4, @on_fail_action=4, @on_fail_step_id=1, @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 NEXT FROM JobCur INTO @JobID, @AgentID;ENDCLOSE JobCur;DEALLOCATE JobCur;GO