Функция SQL CLR и разрешения OleDb - PullRequest
2 голосов
/ 27 ноября 2008

У меня есть библиотека .NET 3.5 C #, которая использует OleDb для извлечения данных из файла Excel и возврата их в DataRowCollection, которая используется табличной функцией CLR в SQL Server 2005.

Я развернул ASSEMBLY в SQL Server как sa и использовал PERMISSION_SET = EXTERNAL_ACCESS. У логина sa EXTERNAL ACCESS ASSEMBLY, а в базе данных TRUSTWORTHY.

Сборка подписана, и я использовал следующую команду caspol.exe, которая указала, что она прошла успешно:

-m -ag All_Code -url "C:\Testing\sqlFunction.dll" FullTrust -n "sqlFunction"

Экземпляр SQL Server, моя библиотека и документ Excel находятся на одном компьютере.

Служба SQL Server работает как локальная система (но, пытаясь заставить ее работать, я также пытался запустить ее как пользователь AD, в который я вошел как локальный администратор).

Я создал приложение командной строки для тестирования запуска библиотеки, и все работает нормально, и данные возвращаются, как и ожидалось.

Но когда я запускаю функцию из SSMS, я получаю эту ошибку в области результатов:

Ошибка .NET Framework при выполнении пользовательской подпрограммы или агрегата «GetExcelFile»:
System.Security.SecurityException: запрос на разрешение типа 'System.Data.OleDb.OleDbPermission, System.Data, версия = 2.0.0.0, культура = нейтральный, PublicKeyToken = b77a5c561934e089' не выполнен.
System.Security.SecurityException:
в System.Security.CodeAccessSecurityEngine.Check (требование объекта, StackCrawlMark & ​​stackMark, логическое значение isPermSet)
в System.Security.PermissionSet.Demand ()
в System.Data.Common.DbConnectionOptions.DemandPermission ()
в System.Data.OleDb.OleDbConnection.PermissionDemand ()
в System.Data.OleDb.OleDbConnectionFactory.PermissionDemand (DbConnection outerConnection)
в System.Data.ProviderBase.DbConnectionClosed.OpenConnection (DbConnection externalConnection, DbConnectionFactory connectionFactory)
в System.Data.OleDb.OleDbConnection.Open ()
в System.Data.Common.DbDataAdapter.QuietOpen (соединение IDbConnection, ConnectionState & originalState)
в System.Data.Common.DbDataAdapter.FillInternal (набор данных DataSet, таблицы данных DataTable [], startRecord Int32, maxRecords Int32, строка String srcTable, команда IDbCommand, поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.Fill (DataTable [] dataTables, Int32 startRecord, Int32 maxRecords, команда IDbCommand, поведение CommandBehavior)
в System.Data.Common.DbDataAdapter.Fill (DataTable dataTable)
в GetExcelFunction.GetFile ()
в GetExcelFunction.InitMethod (имя строки)

Я развернул это на своей личной машине разработчика (XP PRO) и в нашей песочнице для разработчиков (Server 2003) и получил ту же ошибку.

Большинство проблем безопасности доступа к коду связано со сборкой, запущенной с сетевого ресурса, но здесь это не так.

Есть идеи? Я вытащен.

Ответы [ 3 ]

1 голос
/ 27 ноября 2008

Решил!

PERMISSION_SET = EXTERNAL_ACCESS недостаточно. Мне пришлось пройти весь путь до PERMISSION_SET = UNSAFE, и затем он начал работать. Я не могу поверить, что я не пробовал это раньше.

0 голосов
/ 27 ноября 2008

Я ищу код с помощью отражателя. И я просто размышляю, глядя на код.

Попробуйте инициализировать класс System.Data.OleDb.OleDbPermission и используйте его метод Add, чтобы включить строку подключения Excel для получения разрешения (либо до открытия подключения, либо до выполнения запроса).

Надеюсь, это поможет.

0 голосов
/ 27 ноября 2008

Мне жаль, что я не предоставляю решения точной проблемы здесь.

Но вы можете использовать функцию OPENROWSET для работы с файлами Excel с SQL Server. CLR не требуется, если только я не знаю чего-либо.

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