我已经创建了.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调试时,代码可以完美运行并更新多维数据集。
请与我分享上述错误的可能解决方法。
答案 0 :(得分:0)
尝试打开连接时收到安全权限错误。该连接是外部的(即不使用内部的“上下文连接”),因此程序集的PERMISSION_SET
至少应为EXTERNAL_ACCESS
。但是,为此,您需要对程序集进行签名(因为您使用的是Visual Studio,这意味着要为其指定一个强名称),在该强名称键的master
中创建一个非对称密钥,并创建一个登录名从该非对称密钥,然后授予该登录名EXTERNAL ACCESS ASSEMBLY
的权限。或者,如果您使用的是SQL Server 2017(或更高版本),则最后一步更改为授予登录名UNSAFE ASSEMBLY
的权限。
完成这些步骤之后,您可以创建程序集WITH PERMISSION_SET = EXTERNAL_ACCESS
或ALTER ASSEMBLY [{assembly_name}] WITH PERMISSION_SET = EXTERNAL_ACCESS;
有关详细说明,包括如何在Visual Studio中自动执行此操作,使其能够在SQL Server 2017及更高版本中运行,并且不依赖T-SQL脚本以外的外部文件,请参阅以下的两个帖子:我的:
解决方案1描述了假设您想完全保留在Visual Studio使用的强名称密钥/非对称密钥框架中的方法。解决方案2描述了一种仅使用证书的简单方法。