Chcę wymusić resetowanie AppDomain przez SQLCLR. Jak mogę to zrobić oprócz zrestartowania instancji SQL Server?
Chcę wymusić resetowanie AppDomain przez SQLCLR. Jak mogę to zrobić oprócz zrestartowania instancji SQL Server?
Odpowiedzi:
Wiem, że to trochę brutalne, ale co z wyłączeniem CLR i ponownym włączeniem?
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
propagowany przez wysyłanie dziennika, który nie przeładował (lub przynajmniej rozładował) domeny aplikacji. Tak czy inaczej, znalazłem jeszcze łatwiejszą metodę, którą dodałem tutaj do mojej odpowiedzi. Jeśli miałbyś możliwość przetestowania tej nowej metody, byłoby świetnie, ponieważ jestem bardzo ciekawy, czy działa ona w opisanym scenariuszu wysyłania dziennika.
Istnieje bardziej eleganckie rozwiązanie, które nie wpłynie na wszystkie inne zestawy: wystarczy zmienić PERMISSION_SET jednego z zestawów w domenie aplikacji (domeny aplikacji są na użytkownika).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
Pamiętaj tylko, że musisz ustawić PERMISSION_SET z powrotem na to, co było. Musisz także uzyskać dostęp do metody w zespole, zanim zmiana PERMISSION_SET spowoduje jej rozładowanie; zmiana zestawu, który nie jest aktualnie ładowany do domeny aplikacji, która jest aktywna, ale z innym zestawem, nie ma wpływu na domenę aplikacji (Domeny aplikacji są na DB, na użytkownika, a nie na zestaw).
AKTUALIZACJA
Opisana powyżej metoda jest najbardziej szczegółowym podejściem, w którym zwalnia tylko jedną domenę aplikacji. Wymaga to jednak ustawienia zestawu na jednym z dwóch pozostałych poziomów. W przypadku zespołów oznaczonych jako SAFE
będzie to możliwe tylko wtedy, gdy jedno z nich
TRUSTWORTHY ON
, lubEXTERNAL ACCESS ASSEMBLY
czy UNSAFE ASSEMBLY
zezwolenieW takim przypadku możesz po prostu zmienić TRUSTWORTHY
ustawienie, ON
a następnie natychmiast OFF
ponownie powrócić, a to zwolni wszystkie Domeny aplikacji w tej konkretnej bazie danych:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Jeśli i tak masz tylko jedną domenę aplikacji w bazie danych (i podejrzewam, że tak jest w 95% lub więcej przypadków), wówczas obie opisane tutaj metody mają ten sam efekt netto. W tej sytuacji ALTER DATABASE
metoda wydaje się prostsza, ponieważ nie wymaga podania nazwy konkretnego obiektu ani znajomości oryginalnego obiektu PERMISSION_SET
.
RÓWNIEŻ, jeśli masz tylko jedną domenę aplikacji, ALTER DATABASE
metoda jest prostsza, nawet w przypadku, gdy baza danych jest już ustawiona na TRUSTWORTHY ON
lub skonfigurowano logowanie do bazy kluczy z odpowiednim uprawnieniem. Jeśli używasz logowania opartego na kluczach, możesz ustawić TRUSTWORTHY
na, ON
a następnie OFF
ponownie, jak wspomniano powyżej. Ale jeśli już TRUSTWORTHY
ustawiłeś ON
, po prostu odwróć go i ustaw na, OFF
a następnie natychmiast z powrotem na ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Słodkie.