Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 SQL CLR函数和OleDb权限_Sql Server 2005 - Fatal编程技术网

Sql server 2005 SQL CLR函数和OleDb权限

Sql server 2005 SQL CLR函数和OleDb权限,sql-server-2005,Sql Server 2005,我有一个.NET 3.5 C#库,它使用OleDb从Excel文件中提取数据,并将其返回到DataRowCollection中,该DataRowCollection由SQL Server 2005中的CLR表值函数使用 我在SQL Server中将程序集部署为sa,并使用权限集=外部访问。sa登录具有EXTERNAL ACCESS ASSEMBLY,并且数据库具有trustable开启状态 程序集已签名,我使用了以下caspol.exe命令,这表明它已成功: -m -ag All_Code -u

我有一个.NET 3.5 C#库,它使用OleDb从Excel文件中提取数据,并将其返回到DataRowCollection中,该DataRowCollection由SQL Server 2005中的CLR表值函数使用

我在SQL Server中将
程序集部署为sa,并使用
权限集=外部访问
。sa登录具有
EXTERNAL ACCESS ASSEMBLY
,并且数据库具有
trustable
开启状态

程序集已签名,我使用了以下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,版本=2.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089”类型的权限失败。
System.Security.SecurityException:
在System.Security.CodeAccessSecurityEngine.Check(对象请求、堆栈爬网标记和堆栈标记、布尔值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(数据集数据集、数据表[]数据表、Int32 StartRecords、Int32 maxRecords、字符串srcTable、IDbCommand命令、CommandBehavior行为)
位于System.Data.Common.DbDataAdapter.Fill(DataTable[]dataTables,Int32 StartRecords,Int32 maxRecords,IDbCommand命令,CommandBehavior行为)
位于System.Data.Common.DbDataAdapter.Fill(数据表)
在GetExcelFunction.GetFile()中 在GetExcelFunction.InitMethod(字符串日志名)处

我已经在我的个人开发机器(xppro)和我们的开发沙箱(server2003)上部署了它,并得到了相同的错误

大多数代码访问安全问题都是围绕从网络共享运行的程序集而产生的,但这里的情况并非如此


有什么想法吗?我已经筋疲力尽了。

很抱歉,我没有提供一个确切问题的解决方案

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

我正在使用reflector查找代码。我只是在猜测代码

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

我希望这有帮助。

解决了它


权限\设置=外部\访问权限不足。我不得不一直到PERMISSION_SET=UNSAFE,然后它开始工作。我不敢相信我以前没有尝试过。

我使用CLR的主要原因是,除了简单地提取数据外,我还有许多其他要求涉及Excel文件。第二个原因是我的生产环境是64位的,而且还没有64位的JET驱动程序,所以我无论如何都不能使用OPENROWSET。谢谢shahkalpesh。我创建了一个OleDbPermission,并将add方法与我的连接字符串一起使用。但我看不到其他与此相关的内容。我唯一要做的其他事情是创建一个适配器,创建一个表,然后在适配器上使用fill方法。这两个构造函数和fill方法都不接受权限对象。我在MSDN中发现了这一点:该类用于在部分信任情况下启用OLE DB的.NET Framework数据提供程序时的未来使用。OLE DB的.NET Framework数据提供程序当前需要FullTrust权限。目前,使用OleDbPermission类没有效果。