如何编写脚本并将程序集列表加载到 SQL Server?

问题描述 投票:0回答:1

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

sql-server .net-4.0 sqlclr database-deployment database-scripts
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 的程序集) MB)。您可能有多个程序集作为依赖项加载,并且这些大小可能会快速增加。

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

如果文件太大而无法在文本编辑器或 SSMS 中打开,您可以取消注释

WHERE

 上的 
[name]
 谓词过滤并一次执行一个,或者将其设为 
IN
 列表并一次执行多个.

另请记住:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.