【问题标题】:Create assembly with permission_set safe使用权限设置安全创建程序集
【发布时间】:2011-09-29 12:49:44
【问题描述】:

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

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

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

为什么 SQL Server 拒绝程序集,我不能做些什么来获得更详细的输出吗?

【问题讨论】:

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


    【解决方案1】:

    您能粘贴 CREATE DDL 语句吗?您是否自己编写了 CREATE 语句?看起来您可能已经使用了 Visual Studio 中的自动部署。手动试试。 请提供有关程序集的详细信息,它是否访问外部数据?

    【讨论】:

    • 没有外部数据,这是一个简单的create assembly [assembly] from 0x... with permission set = safe; 虽然我已经想通了,但我仍然不确定为什么这是一个问题,但我知道如何解决它。
    【解决方案2】:

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

    根据经验,我使用 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 错误,并且没有任何进一步的信息。

    最后,我将把它作为一个错误提交给微软,错误消息不应该是access denied,而且这个代码实际上是允许的,因为它不会做任何在安全权限集下不允许的事情.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-30
      • 2012-03-08
      • 2010-09-06
      • 1970-01-01
      相关资源
      最近更新 更多