Почему SQL server 2017 не принимает clr?
CREATE ASSEMBLY MyCLR FROM 'D:\MyCLR.dll' WITH PERMISSION_SET = SAFE
Возвращает ошибку
Сборка "MyCLR" ссылается на сборку "system.net.http, version=4.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.", которая отсутствует в текущей базе данных. SQL Server попытался обнаружить и автоматически загрузить указанную сборку из того же места, где расположена ссылающаяся сборка, но операция не удалась (причина: 2(Не удается найти указанный файл.)). Загрузите указанную сборку в текущую базу данных и повторите запрос заново.
Как я понял гугл у меня расходятся версии фрейморка, с помощью которого я создал эту dll (4.8) с версией фреймворка, которая используется sqlserver
SELECT * FROM sys.dm_clr_properties
показывает
directory C:\Windows\Microsoft.NET\Framework64\v4.0.30319\ version v4.0.30319 state CLR is initialized
Хотя все операции делаю на одном компе. Как мне решить данную проблему?
Ответы (1 шт):
Все несколько сложнее.
Есть официальный список поддерживаемых сборок, которые SQL Server может загружать непосредственно из GAC. Любая, даже стандартная, сборка, не вошедшая в данный список, должна быть импортирована в БД вручную со всеми зависимостями (ну кроме перечисленных в списке разумеется). Во время импорта будет выдано предупреждение о возможной несовместимости. Также подобный импорт необходимо выполнять в определенном порядке: сначала зависимости, потом зависимые.
Есть еще один нюанс. Если предполагается, что код импортированной сборки должен иметь доступ к ресурсам за пределами SQL-сервера, то для этой сборки необходимы права UNSAFE, иначе сервер вернет ошибку при попытке выполнить любой запрос наружу. Причем право нужно именно той сборке, в которой выполняется код обращения, а вызывающая этот код пользовательская сборка может быть импортирована с правами SAFE.
Ну и стоит напомнить о том, что в SQL Server 2012 была изменена версия встроенной CLR с 2.0 на 4.0, следовательно сборки, которые работали на более старых версиях могут отказаться работать при наличии определенных зависимостей от среды исполнения и потребуют перекомпиляции или импорта актуальной версии из GAC в случае не поддерживаемых стандартных сборок.