ฉันต้องการบังคับให้ AppDomain ใช้ SQLCLR เพื่อทำการรีเซ็ต ฉันจะทำสิ่งนั้นนอกเหนือจากการรีสตาร์ทอินสแตนซ์ SQL Server ได้อย่างไร
ฉันต้องการบังคับให้ AppDomain ใช้ SQLCLR เพื่อทำการรีเซ็ต ฉันจะทำสิ่งนั้นนอกเหนือจากการรีสตาร์ทอินสแตนซ์ SQL Server ได้อย่างไร
คำตอบ:
ฉันรู้ว่านี่เป็นบิตที่โหดร้าย แต่สิ่งที่เกี่ยวกับการปิดการใช้งาน 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
ALTER ASSEMBLY
แพร่กระจายผ่านบันทึกการจัดส่งที่ไม่ได้โหลดใหม่ (หรือยกเลิกการโหลดอย่างน้อย) App Domain เป็นข้อผิดพลาด ทั้งสองวิธีฉันพบวิธีที่ง่ายยิ่งขึ้นที่ฉันเพิ่มลงในคำตอบของฉันที่นี่ หากคุณมีความสามารถในการทดสอบวิธีการใหม่นี้จะดีมากเพราะฉันอยากรู้ว่ามันทำงานในสถานการณ์การจัดส่งบันทึกที่คุณอธิบาย
มีวิธีแก้ปัญหาที่หรูหรากว่าที่จะไม่ส่งผลกระทบต่อแอสเซมบลีอื่น ๆ ทั้งหมด: เพียงแค่เปลี่ยน 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;
SELECT * FROM sys.dm_clr_appdomains;
ผมตรวจสอบแล้วว่าการเปลี่ยนแปลงจริงถอดโดเมนโดยดูที่ผลจาก หวาน.