SQLCLR存储过程获取“ SecurityException:请求类型为'System.Data.OleDb.OleDbPermission'的权限”错误

时间:2018-07-04 08:00:31

标签: sql-server security .net-assembly sqlclr oledbconnection

我已经创建了.NET SQLCLR存储过程,并将其构建并发布到了本地SQL Server中。

在.NET代码中,我正在使用以下连接字符串:

OleDbConnection connection = new OleDbConnection(
      "provider=MSOLAP.7;data source=(local);initial catalog=AdventureWorksDW2014");

此.NET代码包含多维数据集更新查询。因此,程序集需要更新本地分析服务器上托管的多维数据集。

在SSMS中执行SQLCLR存储过程时,出现以下错误:

  

消息6522,级别16,状态1,过程dbo.SqlStoredProcedure1,第0行

     

[批处理起始行0]执行期间发生.NET Framework错误   用户定义的例程或聚合“ SqlStoredProcedure1”的说明:
  System.Security.SecurityException:请求类型的许可   'System.Data.OleDb.OleDbPermission,System.Data,版本= 4.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.OleDbConnectionFactory.PermissionDemand(DbConnection   externalConnection)位于
  System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection   externalConnection,DbConnectionFactory connectionFactory,   重试TaskCompletionSource`1,DbConnectionOptions userOptions)位于   System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection   externalConnection,DbConnectionFactory connectionFactory)位于   System.Data.OleDb.OleDbConnection.Open()位于   StoredProcedures.SqlStoredProcedure1()


由于某些原因,OleDb连接无法在程序集中正常工作。但是,当从Visual Studio调试时,代码可以完美运行并更新多维数据集。

请与我分享上述错误的可能解决方法。

1 个答案:

答案 0 :(得分:0)

尝试打开连接时收到安全权限错误。该连接是外部的(即不使用内部的“上下文连接”),因此程序集的PERMISSION_SET至少应为EXTERNAL_ACCESS。但是,为此,您需要对程序集进行签名(因为您使用的是Visual Studio,这意味着要为其指定一个强名称),在该强名称键的master中创建一个非对称密钥,并创建一个登录名从该非对称密钥,然后授予该登录名EXTERNAL ACCESS ASSEMBLY的权限。或者,如果您使用的是SQL Server 2017(或更高版本),则最后一步更改为授予登录名UNSAFE ASSEMBLY的权限。

完成这些步骤之后,您可以创建程序集WITH PERMISSION_SET = EXTERNAL_ACCESSALTER ASSEMBLY [{assembly_name}] WITH PERMISSION_SET = EXTERNAL_ACCESS;

有关详细说明,包括如何在Visual Studio中自动执行此操作,使其能够在SQL Server 2017及更高版本中运行,并且不依赖T-SQL脚本以外的外部文件,请参阅以下的两个帖子:我的:

解决方案1描述了假设您想完全保留在Visual Studio使用的强名称密钥/非对称密钥框架中的方法。解决方案2描述了一种仅使用证书的简单方法。