У меня есть библиотека .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) и получил ту же ошибку.
Большинство проблем безопасности доступа к коду связано со сборкой, запущенной с сетевого ресурса, но здесь это не так.
Есть идеи? Я вытащен.