【发布时间】:2008-11-26 22:22:03
【问题描述】:
我有一个 .NET 3.5 C# 库,它使用 OleDb 从 Excel 文件中提取数据并在 SQL Server 2005 中的 CLR 表值函数使用的 DataRowCollection 中返回它。
我在 SQL Server 中将ASSEMBLY 部署为 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 运行该函数时,我在结果窗格中收到此错误:
在执行用户定义的例程或聚合“GetExcelFile”期间发生 .NET Framework 错误:
System.Security.SecurityException:请求“System.Data.OleDb.OleDbPermission,System.Data,Version=2.0.0.0,Culture=neutral,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 outerConnection, DbConnectionFactory connectionFactory)
在 System.Data.OleDb.OleDbConnection.Open()
在 System.Data.Common.DbDataAdapter.QuietOpen(IDbConnection 连接,ConnectionState& originalState)
在 System.Data.Common.DbDataAdapter.FillInternal(DataSet 数据集,DataTable[] 数据表,Int32 startRecord,Int32 maxRecords,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(String logname)
我已将它部署在我的个人开发机器 (XP PRO) 和我们的开发沙箱 (Server 2003) 上,但遇到了同样的错误。
大多数代码访问安全问题都与从网络共享运行的程序集有关 - 但这里的情况并非如此。
有什么想法吗?我被淘汰了。
【问题讨论】:
标签: sql-server-2005