KB2861456 - การแก้ไข: การละเมิดการเข้าถึงในการจําลองแบบ เอเจนต์การกระจายใน SQL Server Transactional Replication

นำไปใช้กับ
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)

อาการ

สมมติว่าคุณมีสภาพแวดล้อมการจําลองแบบธุรกรรมของ Microsoft SQL Server 2008 R2, SQL Server 2012 หรือ SQL Server 2014 มีอินสแตนซ์การแจกจ่ายหลายอินสแตนซ์ของ SQL Server ในสภาพแวดล้อม ในสถานการณ์นี้ อาจเกิดการละเมิดการเข้าถึง และเอเจนต์การกระจายการจําลองแบบ SQL Server หยุดทํางาน นอกจากนี้ ไฟล์การถ่ายโอนข้อมูลขนาดเล็กจะถูกสร้างขึ้น

การแก้ปัญหา

หลังจากที่คุณใช้โปรแกรมแก้ไขด่วนแล้ว เอเจนต์จะปิดการทํางานอย่างเหมาะสมแทนที่จะหยุดทํางานพร้อมกับไฟล์บันทึกข้อมูล คุณสามารถเพิ่มขั้นตอนงานเพิ่มเติมในงานตัวแทนการกระจายเพื่อรีสตาร์ตเอเจนต์โดยอัตโนมัติเมื่อเอเจนต์หยุดทํางานและมีสถานะ "จัดกําหนดการสําหรับการรีสตาร์ต"

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการเพิ่มขั้นตอนงานเพิ่มเติมในงานตัวแทนการกระจาย โปรดดูส่วนข้อมูลเพิ่มเติม

ปัญหานี้ได้รับการแก้ไขครั้งแรกในการอัปเดตแบบสะสมของ SQL Server ต่อไปนี้

การอัปเดตสะสม 1 สําหรับ SQL Server 2014 /en-us/help/2931693

การอัปเดตสะสม 9 สําหรับ SQL Server 2012 SP1 /en-us/help/2931078

การอัปเดตสะสม 11 สําหรับ SQL Server 2012 /en-us/help/2908007

การอัปเดตสะสม 9 สําหรับ SQL Server 2008 R2 SP2 /en-us/help/2887606

เกี่ยวกับการอัปเดตสะสมสําหรับ SQL Server

การอัปเดตแบบสะสมใหม่แต่ละรายการสําหรับ SQL Server จะมีโปรแกรมแก้ไขด่วนและการแก้ไขข้อบกพร่องด้านความปลอดภัยทั้งหมดที่รวมอยู่ในการอัปเดตแบบสะสมครั้งก่อนหน้า ตรวจดูการอัปเดตแบบสะสมล่าสุดสําหรับ SQL Server:

      

แพคเกจการอัปเดตโปรแกรมแก้ไขด่วนสําหรับ SQL Server 2008 R2 Service Pack 1 การแก้ไขสําหรับปัญหานี้เปิดตัวครั้งแรกในแพคเกจการอัปเดตโปรแกรมแก้ไขด่วนสําหรับ SQL Server 2008 R2 Service Pack 1

สถานะ

Microsoft ได้ยืนยันว่านี่เป็นปัญหาที่เกิดขึ้นกับผลิตภัณฑ์ของ Microsoft ที่แสดงไว้ในส่วน "นำไปใช้กับ"

ข้อมูลเพิ่มเติม

หลังจากที่คุณใช้โปรแกรมแก้ไขด่วน ให้เพิ่มสคริปต์ต่อไปนี้ไปยังงานเอเจนต์การกระจาย:DECLARE @JobID BINARY(16)
DECLARE @AgentID int
DECLARE @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 เอเจนต์ ON Job.job_id = Agent.job_id
        ตําแหน่ง 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
        มี COUNT(step_id) = 3
OPEN JobCur
ดึงข้อมูลถัดไปจาก JobCur INTO @JobID, @AgentID
WHILE @@FETCH_STATUS = 0 BEGIN
        ถ้า (@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(''ตัวแทนถูกกําหนดเวลาให้ลองใหม่ กําลังดําเนินการเริ่มระบบของคอมพิวเตอร์ใหม่เดี๋ยวนี้'',16,1)'
                EXEC msdb.dbo.sp_add_jobstep @job\_id=@JobID, '@database\_name=Nการแจกจ่าย', @step\_name=N'ตรวจหาการลองใหม่', @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
        ดึงข้อมูลถัดไปจาก JobCur INTO @JobID, @AgentID;
END
ปิด JobCur;
ยกเลิกการจัดสรร JobCur;
GO