我有一个sql,它有一些函数和存储过程。我有一个EXTERNAL_ACCESS模式的项目和一个签名的密钥。-工作得很好
我向使用ICSharpcode.SharpZipLib的项目添加了另一个函数。我最初得到了一个版本的不兼容错误,我认为我解决了在另一篇文章中的说明。
这个项目没有问题,但是现在我在我的项目的最后一个阶段( server项目)得到了以下错误。这是在我的本地机器上,在那里我有管理特权。
Creating [ICSharpCode.SharpZipLib]... (47,1): SQL72014: .Net SqlClient Data Provider: Msg 6211, Level 16, State 1, Line 1 CREATE ASSEMBLY failed because type '<PrivateImplementationDetails>' in safe assembly 'ICSharpCode.SharpZipLib' has a static field '$$method0x6000014-1'. Attributes of static fields in safe assemblies must be marked readonly in Visual C#, ReadOnly in Visual Basic, or initonly in Visual C++ and intermediate language. (47,0): SQL72045: Script execution error. The executed script: CREATE ASSEMBLY [ICSharpCode.SharpZipLib] AUTHORIZATION [dbo] FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000000000000000000000000000000000000000000000000000000000000000000800000000E1FBA0E00B409CD21B8014CCD21546869732070726F6772616D2063616E6E6F742062652072756E20696E20444F53206D6F64652E0D0D0A2400000000000000504500004C0103003877BE5A0000000000000000E00002210B010B000000020000200000000000009E1B02000020000000200200000040000020000000100000040000000000000004000000000000000060020000100000000000000300408500001000001000000000100000100000000000001000000000000000000000004C1B02004F000000002002003804000000000000000000000000000000000000004002000C00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000080000000000000000000000082000004800000000000000000000002E74657874000000A4FB0100002000000000020000100000000000000000000000000000200000602E7273726300000038040000002002000010000000100200000000000000000000000000400000402E72656C6F6300000C000000004002000 An error occurred while the batch was being executed.
感谢你的帮助!萨蒂亚
发布于 2018-03-31 17:41:54
我想第一件事就是看看你是否可以不使用IcSharpcode.SharpZipLib。如果没有,则:
如果您可以访问IcSharpcode.SharpZipLib的源代码,则可以将静态更改为只读。
最后一个选项是使用PERMISSION_SET = UNSAFE部署程序集。
发布于 2018-03-31 18:07:03
与运行在操作系统上的CLR主机相比,在Server中运行的CLR主机受到高度限制。限制的原因之一是应用程序域是跨会话共享的。因此,执行特定SQLCLR方法(无论是存储过程、函数、用户定义类型、用户定义聚合还是触发器)的每个人都在同一个App的同一个静态类中执行相同的方法。因此,静态类变量是共享资源,除非您在使用这些变量时非常小心和慎重,否则它们很容易导致竞争条件和奇怪(以及难以调试)行为。
错误消息就是关于这一点的,但是它也有一点误导,因为它提到SAFE程序集不允许这样的事情。更准确地说,这是非UNSAFE大会不允许这样的事情(即既不SAFE或EXTERNAL_ACCESS)。
因此,正如尼尔斯在他的回答中所提到的,你可以将大会标记为UNSAFE,它将加载并可能工作。但是,除非您知道如何使用该变量(以及任何其他标记为静态但尚未提及的变量),否则,如果一个会话覆盖另一个会话仍在使用的值,则可能导致争用条件。或者有可能将先前的值留在那里,这可能会对下一个调用方产生不利影响。在尝试将程序集设置为UNSAFE之前,您需要查看代码以确保这不是一个问题。
虽然不是那么快速和容易,但您确实需要从更新代码开始,将这些静态变量标记为readonly,并尝试重新编译,以确保在整个代码中不会尝试写入该变量。如果代码的其他部分确实写入了该静态变量,那么您需要重构代码或找到其他代码来执行相同的操作。我在几年前遇到了这个问题,并选择在我的SQL#项目中使用SQL#,尽管我仍然需要对静态变量等事情做一些小的修改。
https://stackoverflow.com/questions/49590395
复制相似问题