Я портирую старые 32-bit COM
компонент, который был записан в VB6
в целях чтения и записи в Active Directory
сервер. Новое решение будет в C#
и будет использовать SQL CLR
функции пользователя.
Блок, к которому я пытаюсь развернуться SQL Server
содержит ссылку на System.DirectoryServices
. Проект действительно компилирует без любых ошибок, но я не могу развернуть блок на SQL Server
из-за следующей ошибки:
Error: Assembly 'system.directoryservices, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a.' was not found in the SQL catalog.
Что является корректными шагами для регистрации System.DirectoryServices
на SQL Server?
Информация, полученная из других ответов, привела меня к решению. Вот шаги, которые я придумал для дальнейшего использования:
CREATE ASSEMBLY [System.DirectoryServices]
FROM 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.DirectoryServices.dll'
WITH PERMISSION_SET = UNSAFE
GO
В первый раз, когда я запустил вышеприведенный оператор, я получил следующую ошибку:
CREATE ASSEMBLY для сборки 'System.DirectoryServices' failed because assembly 'System.DirectoryServices' is not authorized for PERMISSION_SET = UNSAFE. Сборка авторизована, если верно одно из следующих условий: владелец базы данных (DBO) имеет разрешение UNSAFE ASSEMBLY и база данных имеет свойство базы данных TRUSTWORTHY; или сборка подписана сертификатом или асимметричным ключом, который имеет соответствующий логин с разрешением UNSAFE ASSEMBLY.
Для того чтобы оператор CREATE ASSEMBLY выполнился без ошибок, мне пришлось сначала включить TRUSTWORTHY следующим образом:
ALTER DATABASE DatabaseName SET TRUSTWORTHY ON
GO
После включения TRUSTWORTHY команда выполнилась без ошибок, но выдала следующее пугающее предупреждение:
Warning: Регистрируемая вами сборка Microsoft .NET Framework 'system.directoryservices, version=2.0.0.0, culture=neutral, publickeytoken=b03f5f7f11d50a3a, processorarchitecture=msil.' не полностью протестирована в размещенной среде SQL Server и не поддерживается. В будущем, если вы обновите или обслужите эту сборку или .NET Framework, ваша процедура интеграции CLR может перестать работать. Для получения более подробной информации обратитесь к SQL Server Books Online.
После того как System.DirectoryServices должным образом зарегистрирована в SQL Server, я могу развернуть/регистрировать зависимую пользовательскую сборку SQL CLR без каких-либо проблем.
Помогает ли это: Создание сборки в SQL Server ?
Честно говоря, я мало знаю об использовании SQL Server CLR. Так что, если это поможет, я буду придерживаться этого, чтобы научиться самому. =)
РЕДАКТИРОВАТЬ №1
Вот еще одна интересная ссылка на эту тему.
Проблемы интеграции SQL Server 2005 со средой CLR и регистрации сборки
Надеюсь, это поможет!
Эта статья здесь помогает ??
Новый "одобрено SQLCLR "сборка в SP1
Часто спрашивают про набор базы сборки библиотеки классов, которые могут быть безопасно использовать в SQLCLR. Обычно это принимает форму "могу ли я использовать сборку System.XYZ.dll в процедурном SQLCLR код »или« почему я получаю »сборку System.XYZ.dll не найден ", когда я попробуйте каталогизировать мою собственную сборку, которая называет это? Тот, кто слышит чаще всего упоминается System.DirectoryServices.dll (Активный Справочная поддержка) или System.Management.dll (поддержка WMI) или System.Remoting.dll и др. Единственный способ их использования - запустить CREATE СБОРНИТЕ их самостоятельно, которые предполагает использование PERMISSION_SET = НЕ БЕЗОПАСНО. И каталогизируя все зависимости. Не для слабонервных сердце.
Также - SQL Server CLR не поддерживает все мыслимые сборки - списки здесь:
Одно примечание из второй статьи MSDN :
Неподдерживаемые библиотеки
Неподдерживаемые библиотеки все еще можно вызывать из ваших управляемых хранимых процедур, триггеры, определяемые пользователем функции, определяемые пользователем типы и определяемые пользователем агрегаты. Неподдерживаемая библиотека должна быть сначала зарегистрирована в базе данных SQL Server, с помощью оператора CREATE ASSEMBLY, прежде чем его можно будет использовать в вашем коде.Любая неподдерживаемая библиотека, зарегистрированная и запущенная на сервере, должна быть проверены и протестированы на безопасность и надежность.
Например, пространство имен System.DirectoryServices не поддерживается . Вы должны зарегистрировать сборку System.DirectoryServices.dll в UNSAFE. разрешения, прежде чем вы сможете вызвать его из своего кода. НЕБЕЗОПАСНОЕ разрешение необходимо, потому что классы в пространстве имен System.DirectoryServices не соответствуют требованиям SAFE или EXTERNAL_ACCESS. Для большего информацию см. в разделе Ограничения модели программирования интеграции со средой CLR и Безопасность доступа к интеграционному коду CLR.