本文可帮助你解决 SQL Server CLR 对象的执行失败并返回 System.TypeInitializationException 异常的问题。
适用范围:SQL Server
原始 KB 数: 4576575
现象
重要
本文包含的信息向你介绍了如何在计算机上降低安全设置或关闭安全功能。 您可以通过这些更改来解决特定的问题。 在实施这些更改之前,建议您对在特定环境中实施此解决方法可能带来的风险进行评估。 如果实施此解决方法,请采取任何适当的附加步骤来帮助保护计算机。
安装适用的 .NET Framework 更新以修复 CVE-2020-1147 中所述的漏洞后,执行将 XML 读取到 DataSet 和 DataTable 安全指南对象中的 Common Language Runtime (CLR) 集成生成数据库对象失败。 这是因为存在嵌套 FileNotFoundException 异常的 System.TypeInitializationException 异常。 此问题表示 无法加载 System.Drawing 程序集。
有关参考信息,请参阅以下示例:
Msg 6522,级别 16,状态 1,过程 [CLR 对象], 第 0 行 [Batch Start Line 0] 执行用户定义的例程或聚合“CLR 对象”期间发生的 .NET Framework 错误:
System.TypeInitializationException:“作用域”的类型初始值引发异常。 ---> System.IO.FileNotFoundException:无法加载文件或程序集“System.Drawing,Version=4.0.0.0,Culture=neutral,PublicKeyToken=<Token>”或其依赖项之一。 系统找不到指定的文件。
System.TypeInitializationException:
at System.Data.TypeLimiter.Scope.IsTypeUnconditionallyAllowed(类型类型)
at System.Data.TypeLimiter.Scope.IsAllowedType(类型类型)
at System.Data.TypeLimiter.EnsureTypeIsAllowed(Type type, TypeLimiter capturedLimiter) at System.Data.DataColumn.UpdateColumnType(Type type, StorageType typeCode)
at System.Data.DataColumn..ctor(String columnName, Type dataType, String expr, MappingType 类型)
at System.Data.XSDSchema.HandleElementColumn(XmlSchemaElement elem, DataTable table, Boolean isBase)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement 节点)
at System.Data.XSDSchema.HandleParticle(XmlSchemaParticle pt, DataTable table, ArrayList tableChildren, Boolean isBase)
at System.Data.XSDSchema.HandleComplexType(XmlSchemaComplexType ct, DataTable table, ArrayList tableChildren, Boolean isNillable)
at System.Data.XSDSchema.InstantiateTable(XmlSchemaElement node, XmlSchemaComplexType typeNode, Boolean isRef)
at System.Data.XSDSchema.HandleTable(XmlSchemaElement 节点)
at System.Data.XSDSchema.LoadSchema(XmlSchemaSet schemaSet, DataSet ds)
at System.Data.DataSet.InferSchema(XmlDocument xdoc, String[] excludedNamespaces, XmlReadMode mode)
at System.Data.Data...
解决方法
此问题已在 2020 年 10 月 13 日重新发布 .NET Framework 2020 年 7 月仅限安全的更新中修复。
有关详细信息,包括如何获取修补程序,请参阅 2020 年 7 月仅限安全更新的 .NET Framework 重新发布。
解决方法
警告
此解决方法可能使计算机或网络更容易受到恶意用户或病毒等恶意软件的攻击。 我们不建议使用此解决方法,但提供此信息,以便你可以自行实施此解决方法。 如果使用此解决方法,需自行承担风险。
对于将不受信任的 XML 数据反序列化为任 DataSet
一实例或 DataTable
对象的应用程序,建议使用替代方法访问数据。 对于只读受信任 XML 数据的应用程序,可以尝试以下解决方法之一。
注意
首选解决方法 1 和 2,因为在本地进行了更改。 解决方法 3 是系统范围的。
警告
这些解决方法删除了将 XML 反序列化为实例 DataSet
和 DataTable
对象的类型限制。 如果应用程序读取不受信任的输入,这可能会打开安全漏洞。
解决方法 1:调用 AppContext.SetSwitch
更改 SQL CLR 对象代码的开头,将 Switch.System.Data.AllowArbitraryDataSetTypeInstantiation 开关设置为 true。 必须针对每个适用的 SQL CLR 对象执行此操作。 请参阅以下示例。
有关详细信息,请参阅 DataSet 和 DataTable 安全指南。
解决方法 2:为每个适用的实例创建或更改 Sqlservr.exe.config 文件
此解决方法仅适用于实例本身。
重要
我们无法保证 SQL Server 更新或实例升级不会覆盖此更改。 建议确定更改在实例更新或升级后是否仍然存在。
在 SQL Server 的默认实例和命名实例的文件位置中找到 Sqlservr.exe.config 文件:
%ProgramFiles%\Microsoft SQL Server\<Instance_ID>.<Instance Name>\MSSQL\Binn\
在
<runtime>
节点中,但在任何嵌套节点之外,添加以下行:<AppContextSwitchOverrides value="Switch.System.Data. AllowArbitraryDataSetTypeInstantiation=true"/>
保存文件,然后重启实例。
请参阅 SQL Server 2016 实例的以下示例。
解决方法 3:创建 System.Drawing 程序集
从全局程序集缓存 (GAC)中的 DLL 文件手动在 SQL Server 中创建 System.Drawing 程序集,然后重新创建使用或 .DataSet.ReadXML
DataTable.ReadXML
例如:
CREATE ASSEMBLY [Drawing] FROM 'C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll' WITH PERMISSION_SET = UNSAFE GO
解决方法 4:创建注册表子项
重要
请仔细执行此解决方法中的步骤。 如果注册表修改不正确,可能会发生严重问题。 在修改注册表之前,请备份注册表,以便在出现问题时可以还原。
此解决方法会影响服务器上的所有 .NET 应用程序。 因此,仅当无法使用其他解决方法时,才应使用此方法作为最后手段。
打开注册表编辑器。
找到以下子项:
KEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework\AppContext
创建一个
REG_SZ
值,如下所示。名称 Switch.System.Data.AllowArbitraryDataSetTypeInstantiation 值 是 重启所有 SQL Server 实例。
请参阅以下示例。
详细信息
此问题是由最近的 .NET Framework 安全更新操作来更正 .NET Framework XML 内容标记验证造成的。 不会将 XML 读取到任一DataSet
DataTable
实例或对象的 SQL Server CLR 对象不会受到影响。