Я хочу змусити скинути AppDomain, який використовується SQLCLR. Як я можу це зробити, окрім перезавантаження екземпляра SQL Server?
Я хочу змусити скинути AppDomain, який використовується SQLCLR. Як я можу це зробити, окрім перезавантаження екземпляра SQL Server?
Відповіді:
Я знаю, що це трохи жорстоко, але як бути з відключенням CLR та його повторним включенням?
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
розповсюджений через доставку журналів, який не перезавантажував (або принаймні вивантажував) Домен додатка, був помилкою. У будь-якому випадку я знайшов ще простіший метод, який я додав до своєї відповіді тут. Якщо ви мали можливість протестувати цей новий метод, це було б чудово, тому що мені дуже цікаво дізнатися, чи працює він у описаному вами сценарії доставки журналу.
Існує більш елегантне рішення, яке не вплине на всі інші збірки: просто змініть PERMISSION_SET однієї з збірок у домені програми (домени додатків призначені для користувача).
ALTER ASSEMBLY [AssemblyName] WITH PERMISSION_SET = {1 of the 2 levels that
this assembly is not current at}
Просто пам’ятайте, що вам потрібно буде повернути PERMISSION_SET до того, яким він був. Крім того, вам потрібно отримати доступ до методу в зборі, перш ніж змінити PERMISSION_SET, він вивантажить його; зміна збірки, яка наразі не завантажена у активний домен додатка, але з іншою збіркою, не впливає на домен додатка (Домени додатків - це DB, користувач, а не збірка).
ОНОВЛЕННЯ
Описаний вище метод є найбільш дрібним підходом, коли він буде вивантажити лише один Домен додатка. Але це вимагає, щоб збірка могла бути встановлена на один з двох інших рівнів. Для збірок, позначених як, SAFE
це стане можливим лише в тому випадку, коли вони є
TRUSTWORTHY ON
, абоEXTERNAL ACCESS ASSEMBLY
або UNSAFE ASSEMBLY
дозвіл, абоУ цьому випадку ви можете просто повернути TRUSTWORTHY
налаштування, ON
а потім негайно повернутись назад, OFF
і це вивантажить усі Домени додатків у конкретній базі даних:
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
Якщо у вас в базі даних є лише один домен додатка (і я підозрюю, що це 95% або більше часу), то обидва описані тут методи мають однаковий чистий ефект. І в цій ситуації ALTER DATABASE
метод здається більш простим, оскільки він не вимагає вказувати конкретне ім'я об'єкта, а також не вимагає знати, яким PERMISSION_SET
був оригінал .
ТАКОЖ, якщо у вас є лише один Домен додатка, тоді ALTER DATABASE
метод простіший навіть у тому випадку, коли база даних вже налаштована TRUSTWORTHY ON
або ви налаштували вхід на базі ключів з відповідним дозволом. Якщо ви використовуєте логін на основі ключів , то ви можете встановити , TRUSTWORTHY
щоб ON
потім OFF
знову , як уже згадувалося вище. Але якщо ви вже TRUSTWORTHY
налаштували його ON
, просто переверніть його та встановіть його, OFF
а потім негайно поверніться до ON
:
ALTER DATABASE CURRENT SET TRUSTWORTHY OFF;
ALTER DATABASE CURRENT SET TRUSTWORTHY ON;
SELECT * FROM sys.dm_clr_appdomains;
. Солодке.