Я хочу заставить AppDomain, используемый SQLCLR, быть сброшенным. Как я могу сделать это, кроме перезапуска экземпляра SQL Server?
sql-server
sql-clr
Джастин Даринг
источник
источник
Ответы:
Я знаю, что это немного жестоко, но как насчет отключения CLR и его повторного включения?
источник
ALTER ASSEMBLY
распространяемый через доставку журналов, который не перезагружал (или, по крайней мере, не выгружал) App Domain, был ошибкой. В любом случае, я нашел еще более простой метод, который я добавил к своему ответу здесь. Если бы у вас была возможность протестировать этот новый метод, это было бы здорово, мне было бы очень интересно посмотреть, работает ли он в описанном вами сценарии доставки журналов.Существует более элегантное решение, которое не повлияет на все остальные сборки: просто измените PERMISSION_SET одной из сборок в домене приложения (домены приложения для каждого пользователя).
Просто помните, что вам нужно будет установить PERMISSION_SET обратно к тому, что было. Кроме того, вам нужно получить доступ к методу в сборке, прежде чем изменение PERMISSION_SET будет выгружать его; изменение сборки, которая в данный момент не загружена в домен приложения, который активен, но с другой сборкой, не влияет на домен приложения (домены приложения для каждой БД, для пользователя, а не для каждой сборки).
ОБНОВЛЕНИЕ
Метод, описанный выше, является наиболее детальным подходом, когда он выгружает только один домен приложения. Но для этого требуется, чтобы сборка могла быть установлена на один из двух других уровней. Для сборок, отмеченных как
SAFE
это будет возможно, только еслиTRUSTWORTHY ON
илиEXTERNAL ACCESS ASSEMBLY
либоUNSAFE ASSEMBLY
разрешениеВ этом случае вы можете просто повернуть
TRUSTWORTHY
настройку,ON
а затем сразу жеOFF
снова вернуться, и это разгрузит все домены приложений в этой конкретной базе данных:Если у вас есть только один домен приложений в базе данных в любом случае (и я подозреваю, что это имеет место в 95% или более случаев), тогда оба описанных здесь метода имеют одинаковый чистый эффект. И в этой ситуации
ALTER DATABASE
метод кажется более простым, так как он не требует указания конкретного имени объекта и не требует знания оригиналаPERMISSION_SET
.ТАКЖЕ, если у вас есть только один домен приложения, то этот
ALTER DATABASE
метод проще, даже если база данных уже установленаTRUSTWORTHY ON
или вы настроили регистрацию на основе ключей с соответствующим разрешением. Если вы используете логин на основе ключей , то вы можете установить ,TRUSTWORTHY
чтобыON
затемOFF
снова , как уже упоминалось выше. Но если вы ужеTRUSTWORTHY
установили наON
, то просто измените его и установите на,OFF
а затем немедленно вернитесь кON
:источник
SELECT * FROM sys.dm_clr_appdomains;
. Милая.