วิธีการปรับปรุงแอสเซมบลี CLR โดยไม่ปล่อยแอสเซมบลีจาก SQL Server


18

ฉันจะอัปเดตแอสเซมบลี CLR ฟังก์ชัน (หรือขั้นตอน) ได้อย่างไรโดยไม่ต้องวางและสร้างแอสเซมบลีใน SQL Server (2008 R2) อีกครั้ง

เนื่องจากตอนนี้ถ้าฉันอัปเดตชุดประกอบ (เช่นเพื่อเพิ่มฟังก์ชั่นใหม่), SQL Server จะไม่ให้เกียรติ dll ที่อัปเดตจนกว่าฉันจะวางแอสเซมบลี:

DROP ASSEMBLY CLRFunctions

Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.

แต่ก่อนที่ฉันจะวางแอสเซมบลีได้ฉันจะต้องวางฟังก์ชั่นทั้งหมดที่อ้างอิง:

DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic

และจากนั้นฉันสามารถวางแอสเซมบลี:

DROP ASSEMBLY CLRFunctions

ตอนนี้ฉันต้อง " สร้าง " การชุมนุม:

CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';

และตอนนี้ฉันต้องล่าประกาศทั้งหมดของ UDF ที่ได้รับการลงทะเบียนก่อนที่ผมจะลบพวกเขา

ฉันอยากจะอัปเดตชุดประกอบและให้ SQL Server เริ่มใช้งาน


ปรับปรุง : ฉันพยายามDBCC FREEPROCCACHEบังคับให้ "คอมไพล์ใหม่" แบบสุ่มแต่ SQL Server ยังคงใช้รหัสเดิม

อัปเดต : ฉันลบแอสเซมบลี dll CLRFunctions.dllและ SQL Server ยังคงสามารถเรียกใช้รหัสได้ (โดยไม่ต้องใช้รหัสที่เป็นไปไม่ได้)

คำตอบ:


16

alter assemblyผมคิดว่าคุณกำลังมองหา จาก BOL:

หากระบุส่วนคำสั่ง FROM ALTER ASSEMBLY จะอัปเดตชุดประกอบที่เกี่ยวข้องกับสำเนาล่าสุดของโมดูลที่มีให้ เนื่องจากอาจมีฟังก์ชั่น CLR, โพรซีเดอร์ที่เก็บ, ทริกเกอร์, ชนิดข้อมูลและฟังก์ชั่นรวมที่ผู้ใช้กำหนดในอินสแตนซ์ของ SQL Server ที่กำหนดไว้แล้วกับแอสเซมบลีคำสั่ง ALTER ASSEMBLY เพื่อให้การ rebinding นี้สำเร็จวิธีการที่แมปไปยังฟังก์ชั่น CLR ขั้นตอนการจัดเก็บและทริกเกอร์จะต้องยังคงอยู่ในชุดประกอบที่ถูกแก้ไขด้วยลายเซ็นเดียวกัน คลาสที่ใช้ชนิดที่ผู้ใช้กำหนดเองของ CLR และฟังก์ชั่นรวมที่ผู้ใช้กำหนดต้องยังคงปฏิบัติตามข้อกำหนดสำหรับการเป็นประเภทที่ผู้ใช้กำหนดหรือรวม

หนึ่งในตัวอย่างในหน้าเดียวกันดูเหมือนจะเป็นการหลอกลวง:

ALTER ASSEMBLY ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 

1
สามารถทำสิ่งนี้ได้เมื่อชุดประกอบที่ปรับปรุงแล้วอยู่บนเครื่องไคลเอ็นต์ SSMS แทนที่จะเป็นเครื่องโฮสต์ SQL Server หรือไม่ ฉันไม่มีสิทธิ์เพียงพอบนเซิร์ฟเวอร์เพื่อเข้าถึงระบบไฟล์โดยตรง แต่ฉันมีสิทธิ์เพียงพอที่จะเพิ่มและลบชุดประกอบ CLR
Zarepheth

ไม่เลยส่วนใหญ่ไม่ คุณสามารถระบุเส้นทาง UNC (เช่น \\ เซิร์ฟเวอร์ \ path \ to \ file) และตราบใดที่บัญชีบริการที่โปรแกรม SQL กำลังทำงานอยู่ภายใต้มีสิทธิ์อ่านไฟล์ควรทำงานได้ ตัวเลือกอื่นคือการระบุค่าไบนารีสำหรับแอสเซมบลี หากคุณมีการปรับใช้บนเซิร์ฟเวอร์อื่นแล้วสคริปต์การแก้ไขจากที่นั่นจะทำให้คุณได้รับค่าหยด
Ben Thul

ใช่นั่นคือสิ่งที่ฉันคิด :( บางทีรุ่นที่ใหม่กว่า SSMS จะช่วยให้การปรับปรุงการประกอบจากเครื่องระยะไกลในขณะเดียวกันผมคิดว่าผมลดลงและสร้างประกอบผ่านทาง SSMS GUI -. และดำเนินการวางและสร้างการดำเนินงานสำหรับทุกฟังก์ชั่นขึ้น.
Zarepheth

ฉันจะไม่กลั้นลมหายใจ ทำไมคุณไม่สามารถใช้วิธีใดวิธีหนึ่งที่อธิบายไว้ข้างต้น
เบ็นธูล

1
"การเพิ่มและการแก้ไขแอสเซมบลีต้องมีการอ้างอิงระบบไฟล์" - นี่ไม่เป็นความจริง. ทั้งสองCREATE ASSEMBLYและALTER ASSEMBLYจะใช้หยดที่แสดงถึงการชุมนุม พิสูจน์สิ่งนี้กับตัวคุณเองโดยไปที่ฐานข้อมูลใด ๆ ที่สร้างขึ้นในปี 2008 และไปที่ความสามารถในการเขียนโปรแกรม -> แอสเซมบลีและสคริปต์การสร้างแอสเซมบลี Microsoft.SqlServer.Types นั่น varbinary ขนาดใหญ่คือการชุมนุม เนื่องจากสิ่งนี้ใช้กับสถานการณ์ของคุณให้ปรับใช้ชุดประกอบของคุณกับอินสแตนซ์ในพื้นที่ของคุณสคริปต์ออกและทำให้เป็นALTER ASSEMBLYสคริปต์
เบ็นธูล

7

เพื่อเพิ่มการตอบเบน Thul ของนี้สามารถทำได้จากระยะไกลธรรมได้อย่างง่ายดายผ่านทางสตูดิโอ SQL Server ของฝ่ายจัดการ GUI

  1. ภายใต้ Object Explorer สำหรับฐานข้อมูลของคุณ -> ความสามารถในการโปรแกรมให้คลิกขวาที่ชุดประกอบและเลือก 'ชุดประกอบใหม่ ... '

  2. เรียกดู DLL ที่อัปเดตของคุณ

  3. แทนที่จะคลิก 'ตกลง' (ซึ่งจะล้มเหลวเนื่องจากมีการประกอบชื่อเดียวกันแล้ว) คลิก 'สคริปต์' ที่ด้านบนของหน้าต่างแอสเซมบลีใหม่
     
    คุณจะถูกดร็อปใน SQL Query ที่มีบรรทัด 'CREATE ASSEMBLY' ตามด้วย blob ขนาดใหญ่ที่เป็น DLL ที่คุณเพิ่งเลือก

  4. เปลี่ยน 'สร้าง' เป็น 'แก้ไข' และดำเนินการ!

สคริปต์สร้างบรรทัด 'AUTHORIZATION' สำหรับฉันซึ่งฉันต้องลบออกก่อนที่จะดำเนินการ ระยะของคุณอาจแตกต่างกันไป

ฉันหวังว่านี่จะช่วยให้คนอื่นที่ไม่มีระบบไฟล์เข้าถึงเซิร์ฟเวอร์ของพวกเขา

หวังว่า Microsoft จะทำให้การทำงานระดับเฟิร์สคลาสในวันหนึ่งของ SSMS เป็นไปได้ แต่นี่เป็นการแก้ปัญหาที่ค่อนข้างง่ายจนกว่าจะเสร็จ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.