我有一个存储过程需要一些复杂的数学表达式评估。 有一个公式,这个存储过程会评估它的值。
它调用如下定义的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,这不再有效。
我收到以下错误:
Msg 10314,Level 16,State 11,Procedure GetPermitTypeFeesByPermitID,Line 88 [Batch Start Line 0]
尝试加载程序集ID 65536时,Microsoft .NET Framework中发生错误。服务器可能资源不足,或者程序集可能不受信任。再次运行查询,或检查文档以了解如何解决程序集信任问题。有关此错误的详细信息:System.IO.FileLoadException:无法加载文件或程序集' supermathparser,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null'或其中一个依赖项。发生了与安全性有关的错误。 (来自HRESULT的异常:0x8013150A)System.IO.FileLoadException:
at System.Reflection.RuntimeAssembly._nLoad(AssemblyName fileName,String codeBase,Evidence assemblySecurity,RuntimeAssembly locationHint,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoadAssemblyName(AssemblyName assemblyRef,Evidence assemblySecurity,RuntimeAssembly reqAssembly,StackCrawlMark& stackMark,IntPtr pPrivHostBinder,Boolean throwOnFileNotFound,Boolean forIntrospection,Boolean suppressSecurityChecks)
at System.Reflection.RuntimeAssembly.InternalLoad(String assemblyString,Evidence 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中再次使用它?
谢谢
答案 0 :(得分:2)
我的假设是你尝试调用它的数据库刚刚恢复到SQL Server 2017数据库,这是正确的吗?如果是这样,您尝试调用的函数要么由您自己开发(公司),要么是第三方程序集 - 它不是内置的MS程序集(程序集ID - 65536 - 也表示这一点)。
我的猜测是问题是digital.aaron在他的评论中指出的问题,它与SQL Server 2017中更改的CLR安全模型有关。您可以在this blogpost和{{{}}中了解更多相关信息。 {3}}一种轻松的方法:ish修复它。
希望这有帮助!
尼尔斯
答案 1 :(得分:1)
指向“轻松修复”的链接不起作用,更多上下文可能会更有用。我最终通过以下步骤(在master上运行)快速又肮脏:
ALTER DATABASE <DatabaseName> SET trustworthy ON
此处链接的博客文章仍然有效,而且内容丰富