5

在 SQL Server 2008 上,我试图注册一个似乎只引用受支持的库的程序集。这是我用来注册程序集的 T-SQL 代码:

create assembly MySpatial from 'c:\Spatial.dll'

这会导致以下错误:

消息 6509,级别 16,状态 31,第 1 行从具有 HRESULT 0x80004005 的程序集“空间”收集元数据时发生错误。

但是,如果我添加with permission_set=unsafe,那么 SQL 将成功执行命令。如何找出错误发生的原因,或者为什么我的程序集必须注册为不安全?

4

2 回答 2

3

我遇到了同样的事情,经过一番调查,我认为这是因为编译器对 lambda 表达式进行了优化。从 lambda 表达式创建委托有一些开销。我认为它必须在第一次访问 lambda 时延迟初始化一个包含委托的隐藏静态字段,以便它可以在以后的调用中重用已经构造的委托。

我认为这是因为如果 lambda 捕获任何变量,它不会导致 SAFE 问题。有意义的是,如果它正在捕获变量,则每次调用它时都需要创建一个不同的委托,但如果 lambda 是完全自包含的,它可以缓存它以提高效率。

微软确实在 SQL 2008 中修复了这个问题,但他们不会在 SQL 2005 中修复它,所以如果需要支持现有的 SQL 2005 安装,它所需要的只是消除“静态优化”的 lambda,而不是整个 lambda部件。

于 2013-06-18T15:55:01.657 回答
1

当权限集不安全时,SQL 不会验证程序集的元数据。

尝试应用KB 941256中的修补程序,或为 SP2 应用 CU4E_FAILAltough 与您得到的 HRESULT 不同,也许修补程序解决了这个问题。

于 2009-10-29T22:43:30.547 回答