使用permission_set safe创建程序集

时间:2011-09-29 12:49:44

标签: sql-server clr sql-server-2008-r2

我正在尝试将.NET程序集部署到SQL Server 2008 R2数据库,但我只是遇到了这个错误:

  

部署错误SQL01268:.Net SqlClient数据提供程序:消息6509,级别16,状态31,行1从使用HRESULT 0x80004005从程序集“程序集”收集元数据时发生错误。

现在棘手的部分是我确保框架版本是正确的,我有一个单独的简单CLR数据库项目,我从中添加和测试事情,看看我是否可以隔离问题(我不能)。我甚至编写了一个使用Mono.CecilPEVerify的工具来确保我遵守适用于数据库中CLR项目的编程模型限制。我显然错过了一些东西,但我不知道如何调试这个,为什么SQL Server不能告诉我它失败的原因?

为了获得更详细的输出,为什么SQL Server拒绝汇编,我能做些什么呢?

2 个答案:

答案 0 :(得分:1)

可以粘贴CREATE DDL语句吗?你自己写了CREATE语句吗?看起来您可能已经使用了Visual Studio中的自动部署。手动尝试。 请详细说明组装,是否可以访问外部数据?

答案 1 :(得分:0)

经过两天的调试,这就是我所做的。

根据经验,我使用Cecil重写程序集,通过简单地用throw new NotImplementedException忽略所有构造函数替换所有方法体来取消方法(初始化有点棘手,只是不能杀死方法体构造函数)。执行此操作后,程序集已成功安装。我不知道问题是什么,但我知道它与代码有关。这一直是我的假设。

为了找到实际的方法,我使用了二进制搜索。我替换了程序集中的一半方法,如果错误不存在,我就向左走,否则只要我遇到问题,直到找到导致错误的最小方法集。鉴于它超过2000种方法,我花了大约1-2秒来测试每个配置,它节省了大量时间。

我设法将一个方法简单地归为零,这就是(从我可以看出我的发现,这也必须在一个通用类中)。

class Hashtable<K, V>
{
    IEnumerable<KeyValuePair<K, V>> GetEnumerator()
    {
        var hashtable = new Hashtable();
        return hashtable
            .Cast<DictionaryEntry>()
            .Select(x => new KeyValuePair<K, V>((K)x.Key, (V)x.Value))
            .GetEnumerator();
    }
}

即使编译器应用了大量转换,此代码中的任何内容都不会导致任何IL无效。如果将它放在数据库CLR程序集中,它将拒绝程序集access denied错误而没有任何进一步的信息。

最终,我要将此作为Microsoft的错误提交,错误消息不应该是access denied,而且此代码实际上是允许的,因为它不会执行任何不允许的安全保护许可集。