2

我的 SQL CLR 过程依赖于 log4net,它依赖于 System.Web.dll。

当我上传这个 System.Web.dll 时:

create assembly [System.Web]
from 'C:\Windows\Microsoft.NET\Framework64\v4.0.30319\System.Web.dll'
with permission_set = unsafe;
go

我看到还添加了 20 个其他程序集。好的。如何编写此/这些程序集的脚本并从脚本中的二进制文件上传它们?

4

1 回答 1

1

好消息(大部分)

如果您已经将这些程序集加载到 SQL Server 中,那么您有两个选择。首先,如果您使用的是 SSMS,您也许可以编写程序集的脚本。只是:

  1. 右键单击对象资源管理器中的数据库名称,转到“任务⏵”,然后选择“生成脚本...”。
  2. 选择“选择特定的数据库对象”并在“SQL 程序集”下选择要编写脚本的期望程序集。
  3. 单击“下一步>”按钮
  4. 选择“另存为脚本文件”并输入“文件名:”
  5. 单击“下一步>”按钮
  6. 单击“下一步>”按钮

脚本化的对象可能按依赖顺序排列,在这种情况下,CREATE ASSEMBLY不需要重新排序语句。

如果您遇到错误,如果您需要实际详细信息,则可能需要保存报告。它可能是:

SmoException:找到循环依赖项。

这是我在编写已加载的一些 .NET Framework 库的脚本时遇到的问题。苏……

第二个选项是CREATE ASSEMBLY通过从系统目录视图中选择它们的内容来简单地构造语句:

SELECT N'CREATE ASSEMBLY ' + QUOTENAME(asm.[name]) + NCHAR(0x0A)
         + N' FROM ' + CONVERT(NVARCHAR(MAX), [content], 1) + NCHAR(0x0A)
         + N' WITH PERMISSION_SET = '
         + CASE asm.[permission_set]
                WHEN 3 THEN N'UNSAFE'
                ELSE asm.[permission_set_desc] COLLATE DATABASE_DEFAULT
           END
FROM   sys.assemblies asm
INNER JOIN sys.assembly_files asf
        ON asf.[assembly_id] = asm.[assembly_id]
WHERE  asf.[file_id] = 1
AND    asm.is_user_defined = 1
--AND    asm.[name] = N'{{assembly_name}}'
FOR XML AUTO, ELEMENTS;

警告:不要左键单击返回的 XML 值,该值应显示为链接,如果您左键单击它,将打开一个新选项卡,其中包含应该是格式化的 XML 文档。返回的值很可能对于 SSMS 来说太大而无法处理(它肯定是在我的系统上使用 SSMS 18.10),它会永远挂起,你需要强行终止进程(我只是在尝试一个 4 的程序集兆)。您可能有几个作为依赖项加载的程序集,并且这些大小可以快速加起来。

您需要通过右键单击“结果”选项卡中的任意位置并选择“将结果另存为...”来保存结果。我不确定“另存为类型”是否重要,因为它们都是文本并且只有一个值,但我通常选择“所有文件 (*.*)”。

如果文件太大而无法在文本编辑器或 SSMS 中打开,您可以取消对WHERE谓词过滤的注释[name]并一次执行一个,或者将其设为IN列表并一次执行多个。

另请记住:

  1. 您将需要删除<asm></asm>标签。
  2. 这些值不一定以可以加载的顺序返回,因此您必须进行测试并且可能需要调整CREATE ASSEMBLY语句的顺序。

不太好的消息(可能)

SQL Server 检查 GAC 以查找 SQL Server 中引用的同名程序集。如果找到,它将检查版本号并且它们必须相同(即在 SQL Server 中的程序集和 GAC 中的程序集之间)。如果 SQL Server 中的版本不同,您将收到错误消息。这意味着,如果您加载到 SQL Server 中的任何 .NET Framework 程序集通过 Windows 更新(甚至手动更新 .NET)得到更新,那么您可能需要删除这些程序集并重新加载它们,然后是当前版本。

于 2022-01-10T17:34:56.527 回答