Bagaimana saya bisa memperbarui dll fungsi CLR (atau prosedur) perakitan tanpa harus menjatuhkan dan membuat ulang perakitan di SQL Server (2008 R2)?
Seperti berdiri sekarang jika saya memperbarui majelis (misalnya untuk menambah fungsi baru), SQL Server tidak akan menghormati dll diperbarui sampai saya jatuhkan majelis:
DROP ASSEMBLY CLRFunctions
Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.
Tetapi sebelum saya dapat menghentikan perakitan, saya harus terlebih dahulu menghapus semua fungsi yang merujuknya:
DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic
Dan kemudian saya bisa menjatuhkan perakitan:
DROP ASSEMBLY CLRFunctions
Sekarang saya harus " membuat " perakitan:
CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
Dan sekarang saya harus berburu deklarasi semua UDF yang telah terdaftar sebelum saya dihapus mereka.
saya lebih suka memperbarui majelis, dan SQL Server mulai menggunakannya.
Pembaruan : saya mencoba secara acak DBCC FREEPROCCACHE
untuk memaksa "kompilasi ulang", tetapi SQL Server masih menggunakan kode lama.
Pembaruan : saya menghapus dll perakitan CLRFunctions.dll
, dan SQL Server masih dapat menjalankan kode (tanpa kode yang seharusnya tidak mungkin).
sumber
CREATE ASSEMBLY
danALTER ASSEMBLY
akan mengambil gumpalan yang mewakili majelis. Buktikan ini untuk diri Anda sendiri dengan pergi ke basis data apa pun yang dibuat pada 2008+ dan pergi ke Programmability -> Assemblies dan skrip pembuatan Microsoft.qlServer.Tipe perakitan. Varbinary raksasa itu adalah majelis . Karena ini berlaku untuk situasi Anda, sebarkan majelis Anda ke mesin virtual lokal Anda, skrip keluar, dan buatALTER ASSEMBLY
skrip.Untuk menambah jawaban Ben Thul, ini dapat dicapai dari jarak jauh cukup mudah melalui GUI SQL Server Management Studio .
Di bawah Object Explorer untuk database Anda -> Programmability, klik kanan pada Assemblies dan pilih 'New Assembly ...'.
Jelajahi DLL Anda yang diperbarui.
Alih-alih mengklik 'OK' (yang akan gagal, karena majelis dengan nama yang sama sudah ada) klik 'Script' di bagian atas jendela Majelis Baru.
Anda akan dimasukkan ke dalam SQL Query yang mencakup baris 'CREATE ASSEMBLY' diikuti oleh gumpalan besar yang merupakan DLL yang baru saja Anda pilih.
Ubah 'BUAT' menjadi 'ALTER' dan kemudian jalankan!
Script juga membuat baris 'AUTHORISATION' untuk saya yang harus saya hapus sebelum mengeksekusi; jarak Anda mungkin berbeda.
Saya harap ini membantu orang lain tanpa akses sistem file ke server mereka.
Semoga Microsoft akan membuat ini operasi kelas satu di SSMS suatu hari nanti, tetapi ini adalah solusi yang cukup mudah sampai mereka melakukannya.
sumber
saya menemukan petunjuk pada jawaban di Stackoverflow :
sumber
ALTER ASSEMBLY
... (UPDATE
yang di DML,ALTER
dalam DDL.)