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 执行相同的迁移没有问题。
以下形式的错误:
消息 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_SET
为EXTERNAL_ACCESS
或UNSAFE
不允许使用该权限级别,直到 SQLCLR 权限设置的第二部分得到处理。第二部分是执行以下操作之一:
非常受欢迎的方法
编译时签署程序集(并给它一个密码!)。这有时被称为给它一个强名称。
如果程序集未签名,并且您没有重新编译它的源代码,并且没有任何其他程序集引用它,那么您仍然可以按照本前半部分中的说明对其进行签名博文:http : //ianpicknell.blogspot.com/2009/12/adding-strong-name-to-third-party.html
[master]
从该程序集的 DLL创建一个非对称密钥EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
(该UNSAFE ASSEMBLY
权限还允许将程序集标记为EXTERNAL_ACCESS
,因此您不需要这两个权限)TRUSTWORTHY
包含此程序集的数据库的属性设置为ON
。TRUSTWORTHY
可以保持为OFF
.非首选方法
TRUSTWORTHY ON
EXTERNAL ACCESS ASSEMBLY
或UNSAFE ASSEMBLY
。sa
,或者sysadmin
固定服务器角色中的任何其他登录名,那么您无需担心是否明确设置这两个权限之一,因为它们是由sysadmin
角色隐含的。 归档时间: |
|
查看次数: |
15235 次 |
最近记录: |