.NET SQLCLR 程序集在 SQL Server 2016 中不起作用(错误消息 10314)

Arg*_*Six 6 sql-server sql-clr sql-server-2016

我正在将数据库应用程序从 Windows 2008 R2/SQL Server 2008 R2 迁移到使用第三方 .NET CLR 程序集来解析字符串的 Windows 2012 R2/SQL Server 2016。

我得到的错误是:

尝试加载程序集 ID 65540 时 Microsoft .NET Framework 中发生错误。服务器可能资源不足,或者程序集可能不受 PERMISSION_SET = EXTERNAL_ACCESS 或 UNSAFE 的信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的更多信息:
System.IO.FileLoadException: 无法加载文件或程序集“clrsplit,版本=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全相关的错误。(来自 HRESULT 的异常:0x8013150A)

System.IO.FileLoadException: 在 System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName, String codeBase, Evidence assemblySecurity, RuntimeAssembly locationHint, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean SuppressSecurityChecks. (AssemblyName assemblyRef, Evidence assemblySecurity, RuntimeAssembly reqAssembly, StackCrawlMark& stackMark, IntPtr pPrivHostBinder, Boolean throwOnFileNotFound, Boolean for Introspection, Boolean SuppressSecurityChecks) 在 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblyMarkSecurity, StackIndPrrawlPrawl for Introspection, StackC System.Reflection.RuntimeAssembly。System.Reflection.Assembly.Load(String assemblyString) [SQLSTATE 42000](错误 10314)中的 InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean for Introspection)。

错误:10314,严重性:16,状态:11。

数据库 TRUSTWORTHY 位已设置:

name             is_trustworthy_on
msdb             1
SimplusStaging   1
Run Code Online (Sandbox Code Playgroud)

PERMISSION_SET设置为UNSAFE。组装被标记为不安全,因为那些是供应商的安装说明。尝试删除程序集和相关的 T-SQL 对象并重新创建它们。没变。DBO 用户是 SA 登录名。而且,这是我们用于此数据库/服务器的唯一 CLR 程序集。

这是使用分离/附加的新安装。是否安装了KB2919355,否则将无法安装 SQL Server 2016。

我很想STRING_SPLIT在 2016 年使用新功能,只是该应用程序由第三方支持,并且他们为 2008 R2 构建了所有内容。想要利用 2016 年的一些新功能,即“它运行得更快”。

原始安装和新安装的 db 所有者的 SID 相同。0x01在问题数据库的上下文中运行时,以下两个查询都会返回:

SELECT [sid] FROM sys.database_principals WHERE [name] = N'dbo';
SELECT [owner_sid] FROM sys.databases WHERE [database_id] = DB_ID();
Run Code Online (Sandbox Code Playgroud)

我是否需要为新的 .Net Framework 重新编译 CLR 程序集,还是应该可以正常工作?

在 Windows 2008 R2 上对 SQL 2012 和 2014 执行相同的迁移没有问题。

Sol*_*zky 6

以下形式的错误:

消息 10314,级别 16,状态 11,第 1 行
尝试加载程序集 ID ##### 时 Microsoft .NET Framework 中发生错误。服务器可能会耗尽资源,或者程序集可能不受 PERMISSION_SET = EXTERNAL_ACCESS 或 UNSAFE 的信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的更多信息:
System.IO.FileLoadException: 无法加载文件或程序集 '{_assembly_name_}, Version=#.#.#.#, Culture=neutral, PublicKeyToken=xxxxxxxxxxxxxxxxxx' 或其依赖项之一。发生与安全相关的错误。(来自 HRESULT 的异常:0x8013150A)

意味着程序集,当前标记PERMISSION_SETEXTERNAL_ACCESSUNSAFE不允许使用该权限级别,直到 SQLCLR 权限设置的第二部分得到处理。第二部分是执行以下操作之一

  • 非常受欢迎的方法

    1. 编译时签署程序集(并给它一个密码!)。这有时被称为给它一个强名称。

      如果程序集未签名,并且您没有重新编译它的源代码,并且没有任何其他程序集引用它,那么您仍然可以按照本前半部分中的说明对其进行签名博文:http : //ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html

    2. [master]从该程序集的 DLL创建一个非对称密钥
    3. 从该非对称密钥创建登录
    4. 授予登录这两个权限之一:EXTERNAL ACCESS ASSEMBLYUNSAFE ASSEMBLY(该UNSAFE ASSEMBLY权限还允许将程序集标记为EXTERNAL_ACCESS,因此您不需要这两个权限)
    5. 在它应该存在的任何数据库中创建程序集
    6. 不要将TRUSTWORTHY包含此程序集的数据库的属性设置为ONTRUSTWORTHY可以保持为OFF.
  • 非首选方法

    1. 将大会应存在的数据库更改为 TRUSTWORTHY ON
    2. 确保包含此程序集的数据库所有者的登录名具有以下两个权限之一:EXTERNAL ACCESS ASSEMBLYUNSAFE ASSEMBLY

      如果数据库的所有者是sa,或者sysadmin固定服务器角色中的任何其他登录名,那么您无需担心是否明确设置这两个权限之一,因为它们是由sysadmin角色隐含的。
    3. 如果可能的话,尽量避免这种方法:-)