是否有任何多线程缓存机制可以在SQL CLR函数中工作,而不需要将程序集注册为"不安全"?
由于还介绍在这个职位,只需使用一个lock语句将抛出一个安全组件的异常:
System.Security.HostProtectionException:
Attempted to perform an operation that was forbidden by the CLR host.
The protected resources (only available with full trust) were: All
The demanded resources were: Synchronization, ExternalThreading
Run Code Online (Sandbox Code Playgroud)
我希望对我的函数的任何调用都以线程安全的方式使用相同的内部缓存,以便许多操作可以同时执行缓存读取和写入.基本上 - 我需要一个ConcurrentDictionary可以在SQLCLR"安全"程序集中工作的程序.不幸的是,使用ConcurrentDictionary它本身会产生与上面相同的例外.
是否有内置的SQLCLR或SQL Server来处理这个问题?或者我误解了SQLCLR的线程模型?
我已经阅读了关于SQLCLR的安全限制的内容.特别是,以下文章可能有助于理解我在说什么:
此代码最终将成为分发给其他人的库的一部分,因此我真的不希望将其作为"不安全"运行.
我正在考虑的一个选项(由Spender在下面的评论中提出)是从SQLCLR代码中扩展到tempdb并将其用作缓存. 但我不太清楚到底该怎么做.我也不确定它是否会像内存缓存一样高效. 请参阅下面的更新
我对可能提供的任何其他替代方案感兴趣.谢谢.
例
下面的代码使用静态并发字典作为缓存,并通过SQL CLR用户定义的函数访问该缓存.对函数的所有调用都将使用相同的缓存.但除非装配被注册为"不安全",否则这将无效.
public class UserDefinedFunctions
{
private static readonly ConcurrentDictionary<string,string> Cache =
new ConcurrentDictionary<string, string>();
[SqlFunction]
public static SqlString GetFromCache(string key)
{
string value; …Run Code Online (Sandbox Code Playgroud) 如果我在SSMS中运行此命令:
set showplan_xml on
GO
exec some_procedure 'arg1', 'arg2','arg3'
GO
set showplan_xml off
GO
Run Code Online (Sandbox Code Playgroud)
我获得了查询执行中涉及的完整调用堆栈的XML输出,以及任何建议的索引等.
怎么可能从C#中读到这个?
(一个用例可能是定期启用此功能并在生产环境中记录这些结果,以便密切关注索引建议.)
我有一个返回表的SQL Server 2012存储过程.我必须修改该SP以向返回的表添加其他值.不幸的是,这种附加值来自对Web服务的调用.从我的研究中,我收集主要的方法是在SQL中使用OLE自动化程序(sp_OA ...),或者使用SQLCLR存储过程.给定sp_OA ...过程运行的安全上下文,单个返回值是VARCHAR(10)注册密钥,并且对服务的调用很少(每小时10到20个),我猜测SQLCLR方法是要走的路.此外,Web服务托管在我们的Intranet上,外部世界无法访问.
有没有更好的方法来完成我需要的东西?更好的意思是更高性能,更好的安全性,更容易编码和维护