Jak zaktualizować zestaw CLR bez upuszczania zestawu z SQL Server

18

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 FREEPROCCACHEwymusić „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).

Ian Boyd
źródło

Odpowiedzi:

16

Myślę, że szukasz alter assembly. Z BOL:

Jeśli określono klauzulę FROM, ALTER ASSEMBLY aktualizuje zespół w odniesieniu do najnowszych kopii dostarczonych modułów. Ponieważ mogą istnieć funkcje CLR, procedury składowane, wyzwalacze, typy danych i funkcje agregujące zdefiniowane przez użytkownika w wystąpieniu programu SQL Server, które są już zdefiniowane dla zestawu, instrukcja ALTER ASSEMBLY ponownie wiąże je z najnowszą implementacją zestawu. Aby wykonać to ponowne wiązanie, metody, które są mapowane na funkcje CLR, procedury składowane i wyzwalacze, muszą nadal istnieć w zmodyfikowanym zestawie z tymi samymi podpisami. Klasy, które implementują typy CLR zdefiniowane przez użytkownika i funkcje agregujące zdefiniowane przez użytkownika, muszą nadal spełniać wymagania dotyczące bycia typem lub agregacją zdefiniowaną przez użytkownika.

Jeden z przykładów na tej samej stronie wydaje się być skuteczny:

ALTER ASSEMBLY ComplexNumber 
FROM 'C:\Program Files\Microsoft SQL Server\90\Tools\Samples\1033\Engine\Programmability\CLR\UserDefinedDataType\CS\ComplexNumber\obj\Debug\ComplexNumber.dll' 
Ben Thul
źródło
1
Czy można to zrobić, gdy zaktualizowany zestaw znajduje się na komputerze klienta SSMS, a nie na komputerze hosta programu SQL Server? Nie mam wystarczających uprawnień na serwerze, aby bezpośrednio uzyskać dostęp do jego systemu plików, ale mam wystarczające uprawnienia do dodawania i usuwania zestawów CLR.
Zarepheth,
No cóż, głównie nie. Możesz określić ścieżkę UNC (tj. \\ serwer \ ścieżka \ do \ pliku) i dopóki konto usługi, pod którym działa silnik SQL, ma uprawnienia do odczytu pliku, powinno działać. Inną opcją jest określenie wartości binarnej dla zestawu. Jeśli już masz go wdrożony na innym serwerze, skryptowanie stamtąd alter dostanie ci wartość blob.
Ben Thul,
Tak właśnie myślałem. :( Być może nowsza wersja SSMS pozwoli na aktualizację zestawów ze zdalnego komputera. W międzyczasie
wydaje
Nie wstrzymałabym na tym oddechu. Jeśli chodzi o konieczność upuszczania i odtwarzania, dlaczego nie możesz wykonać żadnej z opisanych powyżej metod?
Ben Thul,
1
„Dodawanie i zmienianie zestawów wymaga odwołania do systemu plików”. - to nie jest prawda. Oba CREATE ASSEMBLYi ALTER ASSEMBLYwezmą 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órz ALTER ASSEMBLYskrypt.
Ben Thul,
7

Aby dodać do odpowiedzi Bena Thula, można to zrobić dość łatwo zdalnie poprzez GUI programu SQL Server Management Studio .

  1. W Eksploratorze obiektów dla bazy danych -> Programowalność, kliknij prawym przyciskiem myszy na Zespoły i wybierz „Nowy zespół ...”.

  2. Przejdź do zaktualizowanej biblioteki DLL.

  3. 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.

  4. 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ą.

F. Shinn
źródło
1

znalazłem podpowiedź przy odpowiedzi na Stackoverflow :

ALTER ASSEMBLY CLRFunctions FROM 'c:\foos\CLRFunctions.dll';
Ian Boyd
źródło
1
Miałeś na myśli ALTER ASSEMBLY... ( UPDATEjest w DML, ALTERjest w DDL.)
miroxlav