Почему SQL Server не регистрирует мою сборку как безопасную? - PullRequest
4 голосов
/ 30 октября 2009

В SQL Server 2008 я пытаюсь зарегистрировать сборку, которая, по-видимому, ссылается только на поддерживаемые библиотеки . Вот код T-SQL, который я использую для регистрации сборки:

create assembly MySpatial from 'c:\Spatial.dll'

Это приводит к следующей ошибке:

Сообщение 6509, Уровень 16, Состояние 31, Строка 1 Произошла ошибка при сборе метаданные из сборки «Пространственные» с HRESULT 0x80004005.

Однако, если я добавлю with permission_set=unsafe, SQL выполнит команду успешно. Как я могу узнать, почему произошла ошибка, или почему моя сборка должна быть зарегистрирована как небезопасная?

Ответы [ 2 ]

2 голосов
/ 18 июня 2013

Я столкнулся с тем же самым, и после некоторого исследования, я думаю, что это из-за оптимизации, которую компилятор делает с лямбда-выражениями. Существуют некоторые накладные расходы при создании делегата из лямбда-выражения. Я думаю, что он должен лениво инициализировать скрытое статическое поле, содержащее делегат при первом обращении к лямбде, чтобы он мог повторно использовать уже созданный делегат в будущих вызовах.

Причина, по которой я думаю, заключается в том, что если лямбда захватывает какие-либо переменные, это не вызывает проблему SAFE. Было бы разумно, если бы он захватывал переменные, вам нужно было бы создавать разные делегаты для каждого его вызова, но если лямбда-код полностью автономен, он может кэшировать его в целях эффективности.

Microsoft исправила проблему в SQL 2008, но не исправила ее в SQL 2005, поэтому, если необходимо поддерживать существующие установки SQL 2005, все, что требуется, - это устранить «статически оптимизируемые» лямбды, а не все лямбды во всей сборке.

1 голос
/ 30 октября 2009

Если набор разрешений небезопасен, SQL не будет проверять метаданные вашей сборки.

Попробуйте применить исправление от KB 941256 или CU4 для SP2 . Хотя HRESULT отличается от E_FAIL, который вы получаете, возможно, исправление решает проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...