【问题标题】:SQL CLR function and OleDb permissionsSQL CLR 函数和 OleDb 权限
【发布时间】: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


    【解决方案1】:

    解决了!

    PERMISSION_SET = EXTERNAL_ACCESS 还不够。我不得不一直到 PERMISSION_SET = UNSAFE 然后它开始工作。我不敢相信我以前没有尝试过。

    【讨论】:

      【解决方案2】:

      很抱歉,我没有针对此处的确切问题提供解决方案。

      但是,您可以使用 OPENROWSET 函数处理来自 SQL Server 的 Excel 文件。 CLR 不是必需的,除非有我不知道的东西。

      【讨论】:

      • 我使用 CLR 的主要原因是除了简单地提取数据之外,我还有许多其他要求涉及使用 Excel 文件。第二个原因是我的生产环境是 64 位的,还没有 64 位的 JET 驱动,所以无论如何我都不能使用 OPENROWSET。
      【解决方案3】:

      我正在使用反射器查看代码。我纯粹是在猜测代码。

      尝试初始化 System.Data.OleDb.OleDbPermission 类并使用它的 Add 方法包含 excel 连接字符串以获得权限(在连接打开或查询执行之前)。

      希望对你有帮助。

      【讨论】:

      • 感谢 shahkalpesh。我创建了一个 OleDbPermission 并将 add 方法与我的连接字符串一起使用。
      • 但我看不出与它有什么关系。我唯一要做的其他事情是创建一个适配器,创建一个表,然后在适配器上使用填充方法。两个构造函数和 fill 方法都不接受权限对象。
      • 我在 MSDN 中发现了这一点:当为部分信任方案启用 OLE DB 的 .NET Framework 数据提供程序时,此类供将来使用。 OLE DB 的 .NET Framework 数据提供程序当前需要 FullTrust 权限。目前,使用 OleDbPermission 类没有任何效果。
      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 2011-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-02
      相关资源
      最近更新 更多