Jak mogę zaktualizować dll zestawu funkcji (lub procedury) CLR bez konieczności upuszczania i ponownego tworzenia zestawu w SQL Server (2008 R2)?
W obecnej sytuacji, jeśli zaktualizuję zestaw (np. Aby dodać nową funkcję), SQL Server nie zaakceptuje zaktualizowanej biblioteki DLL, dopóki nie upuszczę zestawu:
DROP ASSEMBLY CLRFunctions
Msg 6590, Level 16, State 1, Line 1
DROP ASSEMBLY failed because 'CLRFunctions' is referenced by object 'NormalizeString'.
Ale zanim mogę upuścić zestaw, muszę najpierw upuścić wszystkie funkcje, które się do niego odwołują:
DROP FUNCTION NormalizeString
DROP FUNCTION RemoveDiacritics
DROP FUNCTION RemoveCombiningDiacritics
DROP FUNCTION CombineLigatures
....
DROP FUNCTION PseudolocalizeArabic
A potem mogę upuścić zestaw:
DROP ASSEMBLY CLRFunctions
Teraz muszę „ utworzyć ” zespół:
CREATE ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
A teraz muszę wyśledzić deklarację wszystkich UDF, które zostały zarejestrowane, zanim je usunąłem.
wolałbym zaktualizować zestaw i pozwolić, aby SQL Server zaczął go używać.
Aktualizacja : losowo próbowałem DBCC FREEPROCCACHE
wymusić „rekompilację”, ale SQL Server nadal używa starego kodu.
Aktualizacja : usunąłem dll zestawu CLRFunctions.dll
, a SQL Server nadal może uruchomić kod (bez kodu, który powinien być niemożliwy).
źródło
CREATE ASSEMBLY
iALTER ASSEMBLY
wezmą obiekt blob reprezentujący zestaw. Udowodnij to sobie, przechodząc do dowolnej bazy danych utworzonej w 2008+ i przejdź do Programowalność -> Zespoły i zrób skrypt tworzenia zestawu Microsoft.SqlServer.Types. Ten gigantyczny varbinary jest zgromadzeniem . Ponieważ dotyczy to Twojej sytuacji, zainstaluj zestaw w lokalnej instancji, wypisz go i stwórzALTER ASSEMBLY
skrypt.Aby dodać do odpowiedzi Bena Thula, można to zrobić dość łatwo zdalnie poprzez GUI programu SQL Server Management Studio .
W Eksploratorze obiektów dla bazy danych -> Programowalność, kliknij prawym przyciskiem myszy na Zespoły i wybierz „Nowy zespół ...”.
Przejdź do zaktualizowanej biblioteki DLL.
Zamiast klikać „OK” (co się nie powiedzie, ponieważ zespół o tej samej nazwie już istnieje) kliknij „Skrypt” w górnej części okna Nowego zestawu.
Zostaniesz przeniesiony do zapytania SQL zawierającego wiersz „UTWÓRZ ZESPÓŁ”, a następnie ogromny obiekt blob, którym jest właśnie wybrana biblioteka DLL.
Zmień „UTWÓRZ” na „ZMIEŃ”, a następnie uruchom!
Skrypt utworzył także dla mnie wiersz „AUTORYZACJA”, który musiałem usunąć przed wykonaniem; twój przebieg może się różnić.
Mam nadzieję, że pomoże to komuś innemu bez dostępu systemu plików do ich serwerów.
Mamy nadzieję, że kiedyś Microsoft sprawi, że będzie to pierwsza operacja w SSMS, ale jest to dość łatwe obejście, dopóki tego nie zrobią.
źródło
znalazłem podpowiedź przy odpowiedzi na Stackoverflow :
źródło
ALTER ASSEMBLY
... (UPDATE
jest w DML,ALTER
jest w DDL.)