如何编写程序集列表并将其加载到 SQL 服务器?

How to script and load assemblies list to SQL Server?

我的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 个其他程序集。 行。 如何编写 this/these 程序集脚本并从脚本中的二进制文件上传它们?

好消息(大部分)

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

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

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

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

SmoException: Cyclic dependencies found.

这是我在编写已加载的一些 .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;

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

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

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

另请记住:

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

不太好的消息(可能)

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