我创建了.NET SQLCLR存储过程,并在本地SQL Server上构建并发布了它。
在 .NET 代码中,我使用此连接字符串:
OleDbConnection connection = new OleDbConnection(
"provider=MSOLAP.7;data source=(local);initial catalog=AdventureWorksDW2014");
此 .NET 代码包含一个多维数据集更新查询。因此,程序集需要更新本地分析服务器上托管的多维数据集。
在 SSMS 中执行 SQLCLR 存储过程时,出现以下错误:
Msg 6522,级别 16,状态 1,过程 dbo。SqlStorageProcedure1, line 0
[批处理起始行 0] 执行过程中发生 .NET 框架错误 用户定义的例程或聚合 "SqlStoredProcedure1":
System.Security.SecurityException: 请求类型的权限 'System.Data.OleDb.OleDbPermission, System.Data, version=4.0.0.0, 区域性=中性,公钥令牌=b77a5c561934e089' 失败。 System.Security.SecurityException: at System.Security.CodeAccessSecurityEngine.Check(Object demand, StackCrawlMark&stackMark, Boolean isPermSet( at System.Security.PermissionSet.Demand(( at System.Data.Common.DbConnectionOptions.DemandPermission(( at System.Data.OleDb.OleDbConnectionFactory.PermissionDemand(DbConnection outerConnection( at
System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource'1 retry, DbConnectionOptions userOptions( at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory( at System.Data.OleDb.OleDbConnection.Open(( at StoredProcedures.SqlStoredProcedure1((
由于某种原因,OleDb 连接无法从程序集工作。但是,当从 Visual Studio 调试时,代码运行良好并更新多维数据集。
请与我分享上述错误的潜在修复方法。
尝试打开连接时收到安全权限错误。连接是外部的(即不使用内部的"上下文连接"(,因此程序集需要具有至少EXTERNAL_ACCESS
的PERMISSION_SET
。但是,为了做到这一点,您需要对程序集进行签名(因为您使用的是 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脚本以外的外部文件,请参阅我的以下两篇文章:
- SQLCLR 与.SQL Server 2017,第 2 部分:"CLR 严格安全性" – 解决方案 1
- SQLCLR 与.SQL服务器 2017,第 3 部分:"CLR 严格安全性" – 解决方案 2
解决方案 1 描述了如何实现此目的,假设您希望完全保留在 Visual Studio 使用的强名称密钥/非对称密钥框架中。解决方案 2 介绍了仅使用证书的不太复杂的方法。