นอกเหนือจากการรีสตาร์ท SQL Server มีวิธีใดที่จะบังคับให้ SQLCLR AppDomain ถูกรีเซ็ตหรือไม่


11

ฉันต้องการบังคับให้ AppDomain ใช้ SQLCLR เพื่อทำการรีเซ็ต ฉันจะทำสิ่งนั้นนอกเหนือจากการรีสตาร์ทอินสแตนซ์ SQL Server ได้อย่างไร


ไม่แน่ใจว่าคุณได้รับการแจ้งเตือนเมื่อมีการตอบรับการปรับปรุง แต่ฉันได้อัปเดตคำตอบของฉันด้วยวิธีที่ง่ายยิ่งขึ้น :)
โซโลมอน Rutzky

คำตอบ:


6

ฉันรู้ว่านี่เป็นบิตที่โหดร้าย แต่สิ่งที่เกี่ยวกับการปิดการใช้งาน CLR และเปิดใช้งานอีกครั้ง?

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 0;
GO
RECONFIGURE;
GO
sp_configure 'clr enabled', 1;
GO
RECONFIGURE;
GO

2
รายละเอียดที่สำคัญอย่างหนึ่งเกี่ยวกับวิธีนี้คือมันทำงานได้เมื่อทำงานกับฐานข้อมูล STANDBY (อ่านอย่างเดียว); วิธีอื่นทั้งหมดที่ฉันพยายามทำไม่ได้ ฉันต้องการสิ่งนี้เพราะการอัพเดทแอสเซมบลี CLR แพร่กระจายตามปกติผ่านบันทึกการจัดส่งไปยังแคตตาล็อก STANDBY แต่ AppDomain ไม่ได้รีโหลด --- ดังนั้นมันจึงยังคงรันโค้ดจากเวอร์ชันเก่าของ. dll ประมาณหนึ่งวัน
Granger

@Granger น่าสนใจและรู้ดี :) อย่างไรก็ตามฉันจะพิจารณาว่ามีข้อผิดพลาดภายใน SQL Server คุณอาจต้องการรายงานว่าผ่านไซต์เชื่อมต่อ: connect.microsoft.com/SQLServer/Feedback
โซโลมอน Rutzky

1
@srutzky - ขอบคุณสำหรับคำแนะนำ; ฉันคาดหวังว่าพวกเขาจะปิดรายงานเป็น "จะไม่แก้ไข" การตั้งค่าทั้งเซิร์ฟเวอร์ไม่ใช่ต่อแคตตาล็อก (เช่น 'ทริกเกอร์ซ้อน', 'ระดับการเข้าถึงไฟล์สตรีม' เป็นต้น) นั่นเป็นความสามารถของเวิร์มที่ฉันพยายามจะเปิด
Granger

@Ganger (และ Max): ฉันไม่ชัดเจนเกี่ยวกับสิ่งที่ฉันพูดฉันคิดว่าเป็นข้อผิดพลาด ฉันไม่ได้บอกว่าการรีเซ็ตการตั้งค่า "เปิดใช้งาน CLR" ทำให้การยกเลิกการโหลดเป็นปัญหา ฉันกำลังบอกว่าการALTER ASSEMBLYแพร่กระจายผ่านบันทึกการจัดส่งที่ไม่ได้โหลดใหม่ (หรือยกเลิกการโหลดอย่างน้อย) App Domain เป็นข้อผิดพลาด ทั้งสองวิธีฉันพบวิธีที่ง่ายยิ่งขึ้นที่ฉันเพิ่มลงในคำตอบของฉันที่นี่ หากคุณมีความสามารถในการทดสอบวิธีการใหม่นี้จะดีมากเพราะฉันอยากรู้ว่ามันทำงานในสถานการณ์การจัดส่งบันทึกที่คุณอธิบาย
โซโลมอน Rutzky

8

มีวิธีแก้ปัญหาที่หรูหรากว่าที่จะไม่ส่งผลกระทบต่อแอสเซมบลีอื่น ๆ ทั้งหมด: เพียงแค่เปลี่ยน PERMISSION_SET ของแอสเซมบลีหนึ่งในโดเมนแอป (โดเมนแอปต่อผู้ใช้)

ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that 
                                                      this assembly is not current at}

เพียงจำไว้ว่าคุณจะต้องตั้งค่า PERMISSION_SET กลับไปเป็นเหมือนเดิม นอกจากนี้คุณต้องเข้าถึงวิธีการในแอสเซมบลีก่อนที่จะเปลี่ยน PERMISSION_SET จะยกเลิกการโหลด การเปลี่ยนแอสเซมบลีที่ไม่ได้โหลดลงในโดเมนแอพที่ใช้งานอยู่ แต่ด้วยแอสเซมบลีอื่นไม่มีผลต่อโดเมนแอป (โดเมนแอปเป็นแบบต่อ DB ฐานข้อมูลต่อผู้ใช้


อัปเดต
วิธีการที่อธิบายไว้ข้างต้นเป็นวิธีที่ละเอียดที่สุดซึ่งจะยกเลิกการโหลดแอปหนึ่งโดเมนนั้นเท่านั้น แต่ไม่จำเป็นต้องให้แอสเซมบลีสามารถตั้งค่าเป็นหนึ่งในอีกสองระดับ สำหรับชุดประกอบที่ทำเครื่องหมายว่าSAFEจะเป็นไปได้ก็ต่อเมื่อ

  • ฐานข้อมูลถูกตั้งค่าเป็นTRUSTWORTHY ONหรือ
  • แอสเซมบลีที่มีการลงนามและเข้าสู่ระบบตามคีย์ไม่สมมาตรที่ตัวเองตามลายเซ็นเดียวกันเป็นแอสเซมบลีที่มีอยู่และได้รับอนุญาตEXTERNAL ACCESS ASSEMBLYหรือการUNSAFE ASSEMBLYอนุญาต

ในกรณีนี้คุณสามารถเปิดการTRUSTWORTHYตั้งค่าONจากนั้นกลับมาOFFอีกครั้งทันทีและจะยกเลิกการโหลดแอปโดเมนทั้งหมดในฐานข้อมูลนั้น:

ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;

หากคุณมี App Domain เพียงตัวเดียวในฐานข้อมูล (และฉันสงสัยว่านี่เป็นกรณี 95% หรือมากกว่านั้น) วิธีการทั้งสองที่อธิบายไว้ที่นี่จะมีผลกระทบสุทธิเหมือนกัน และในสถานการณ์ดังกล่าวALTER DATABASEดูเหมือนว่าวิธีการจะง่ายกว่าเพราะไม่จำเป็นต้องระบุชื่อวัตถุเฉพาะและไม่จำเป็นต้องรู้ว่าต้นฉบับPERMISSION_SETคืออะไร

นอกจากนี้หากคุณมี App Domain เพียงอันเดียวALTER DATABASEวิธีการนั้นจะง่ายกว่าแม้ในกรณีที่ฐานข้อมูลถูกตั้งค่าไว้แล้วTRUSTWORTHY ONหรือคุณได้ตั้งค่าการเข้าสู่ระบบฐานคีย์ด้วยการอนุญาตที่เหมาะสม หากคุณใช้การเข้าสู่ระบบด้วยคีย์คุณสามารถตั้งค่าTRUSTWORTHYเป็นONแล้วOFFอีกครั้งตามที่กล่าวไว้ข้างต้น แต่ถ้าคุณได้TRUSTWORTHYตั้งค่าไปONแล้วเพียงแค่ย้อนกลับและตั้งเป็นOFFและจากนั้นกลับไปที่ON:

ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;

1
วิธีการอัพเดตนี้ทำงานบนแคตาล็อกฐานข้อมูล STANDBY (READ_ONLY) SQL Server อนุญาตให้ฉันเปลี่ยนการตั้งค่า "TRUSTWORTHY" จากนั้นเรียกคืนเป็นค่าเดิม SELECT * FROM sys.dm_clr_appdomains;ผมตรวจสอบแล้วว่าการเปลี่ยนแปลงจริงถอดโดเมนโดยดูที่ผลจาก หวาน.
Granger
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.