2

我有一个需要一些复杂的数学表达式评估的存储过程。有一个公式,这个存储过程评估它的值。

它调用定义如下的 UDF:

ALTER FUNCTION [dbo].[udfComputeMath]
    (@inputString [NVARCHAR](MAX))
RETURNS [NVARCHAR](4000) 
WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [SMP_Assembly].[SuperMathParser.MathParser].[ComputeMath] 

这是相当古老的代码,它从 SQL Server 2008 R2(至少)到 2016 年都运行良好。

但是现在我们尝试将我们的数据库更新到 SQL Server 2017,这不再有效。

我收到以下错误:

消息 10314,级别 16,状态 11,过程 GetPermitTypeFeesByPermitID,第 88 行 [Batch Start Line 0]
Microsoft .NET Framework 在尝试加载程序集 id 65536 时发生错误。服务器可能资源不足,或者程序集可能不被信任。再次运行查询,或查看文档以了解如何解决程序集信任问题。有关此错误的更多信息:

System.IO.FileLoadException:无法加载文件或程序集“supermathparser,Version=0.0.0.0,Culture=neutral,PublicKeyToken=null”或其依赖项之一。发生与安全有关的错误。(来自 HRESULT 的异常:0x8013150A) System.IO.FileLoadException:

在 System.Reflection.RuntimeAssembly._nLoad(AssemblyName 文件名,字符串代码库,证据 assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 throwOnFileNotFound,布尔 forIntrospection,布尔suppressSecurityChecks)

在 System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,证据 assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,布尔 throwOnFileNotFound,布尔 forIntrospection,布尔suppressSecurityChecks)

在 System.Reflection.RuntimeAssembly.InternalLoad(字符串 assemblyString,证据 assemblySecurity,StackCrawlMark 和 stackMark,IntPtr pPrivHostBinder,Boolean forIntrospection)

在 System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString, Evidence assemblySecurity, StackCrawlMark& stackMark, Boolean forIntrospection) 在 System.Reflection.Assembly.Load(String assemblyString)

知道如何在 SQL Server 2017 中再次进行这项工作吗?

谢谢

4

2 回答 2

2

我的假设是您尝试调用它的数据库刚刚恢复到 SQL Server 2017 数据库,对吗?如果是这样,您尝试调用的函数要么是您自己(公司)开发的,要么是第三方程序集 - 它不是内置的 MS 程序集(程序集 id - 65536 - 也表明了这一点)。

我的猜测是问题出在 digital.aaron 在他的评论中指出的问题,它与 SQL Server 2017 中更改的 CLR 安全模型有关。您可以在这篇博文中阅读更多相关信息,这里是一种轻松的方法:ish修理它。

希望这可以帮助!

尼尔斯

于 2017-12-29T04:21:16.827 回答
1

链接到“轻松修复”不起作用,更多上下文会更有帮助。我最终使用以下内容快速而肮脏(在主服务器上运行):

ALTER DATABASE <DatabaseName> SET trustworthy ON

此处链接的博客文章仍然有效,并且信息量很大

于 2020-03-16T15:55:53.740 回答