由于客户端无法访问SQL CLR程序集,因此我们不得不担心这只是我们自己的错误。仔细使用,"不安全"可以很安全。你觉得怎么样?
答案 0 :(得分:2)
"不安全"并不总是谁在执行代码,而是正在执行什么代码和/或它是如何编码的。 UNSAFE
程序集允许代码即使在理想/正确使用中也可能使SQL Server不稳定,或允许安全漏洞,或允许奇/意外行为。例如,使用TimeZoneInfo
转换时区之间的时间需要不安全,即使它应该是一个简单的计算。问题是在该代码库中的某个地方存在导致内存泄漏的问题。试图对日期列进行批量更新的人经历过这种情况。 UNSAFE
也用于可以为安全但尚未经过Microsoft验证的代码,因此无法保证。在使用不受支持的.NET Framework库方面,这些库不仅无法保证按预期工作(或者没有内存泄漏或线程安全),但它们甚至无法保证可以在任何未来的.NET Framework中使用更新(例如:ServiceModel
在.NET Framework v 4.0中变为混合模式,因此从SQL Server 2012开始,任何将ServiceModel
导入SQL Server 2005,2008或2008 R2的人都不能更长时间导入它,并且如果他们想要升级SQL Server,则必须重写一堆代码。)
但回到这个问题,当你控制代码时它是多么不安全?你可能不允许任何安全漏洞,但你绝对可以让自己陷入内存泄漏和“奇怪”的境地。由于共享内存(即静态变量)/同步问题导致的行为很难重现和调试。例如,以下是DBA.StackExchange上有关仅在系统更频繁地开始调用SQLCLR函数时才开始发生的错误的问题。问题是由于使用静态变量来存储陈述,然后多个会话覆盖值并在他们从该变量读取时获得意外值:
SQLCLR assembly throws error when multiple queries run simultaneously
可以使用UNSAFE
装配件"安全&#34 ;?当然。如果您使用静态变量进行缓存,并且如果它始终为null则重新加载,那应该没问题。或者,可能加载不受支持的.NET Framework库(几乎总是必须标记为UNSAFE
),但仅使用" safe"其中的方法(仅仅因为程序集的代码是"不安全"并不意味着将会执行"不安全的代码)。缺点是:1)你不知道这些库正在做什么,即使你在reference.microsoft.com上查看了一些库。 2)你仍然有可能在某些时候将库更新为混合模式,然后你必须重写所有内容。