如何编写程序集列表并将其加载到 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,则可以编写程序集脚本。只是:
- 右键单击对象资源管理器中的数据库名称,转到“任务 ⏵”,然后 select“生成脚本...”。
- 选择“Select 特定数据库对象”并在“SQL 程序集”下选择需要编写脚本的程序集。
- 单击“下一步 >”按钮
- Select“另存为脚本文件”,在“文件名:”中输入:
- 单击“下一步 >”按钮
- 单击“下一步 >”按钮
脚本输出的对象可能按依赖顺序排列,在这种情况下,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
列出并一次做几个。
另请记住:
- 您需要删除
<asm>
和 </asm>
标签。
- 这些值不一定按可以加载的顺序返回,因此您必须进行测试,并且可能需要调整
CREATE ASSEMBLY
语句的顺序。
不太好的消息(可能)
SQL 服务器检查 GAC 以查找在 SQL 服务器中引用的同名程序集。如果找到任何版本,它将检查版本号并且它们必须相同(即 SQL 服务器中的程序集与 GAC 中的程序集之间)。如果 SQL 服务器中的版本不同,您将收到错误消息。这意味着,如果您加载到 SQL 服务器的任何 .NET Framework 程序集通过 Windows 更新(甚至手动更新 .NET)进行更新,那么您可能需要删除这些程序集并使用当前版本重新加载它们。
我的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,则可以编写程序集脚本。只是:
- 右键单击对象资源管理器中的数据库名称,转到“任务 ⏵”,然后 select“生成脚本...”。
- 选择“Select 特定数据库对象”并在“SQL 程序集”下选择需要编写脚本的程序集。
- 单击“下一步 >”按钮
- Select“另存为脚本文件”,在“文件名:”中输入:
- 单击“下一步 >”按钮
- 单击“下一步 >”按钮
脚本输出的对象可能按依赖顺序排列,在这种情况下,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
列出并一次做几个。
另请记住:
- 您需要删除
<asm>
和</asm>
标签。 - 这些值不一定按可以加载的顺序返回,因此您必须进行测试,并且可能需要调整
CREATE ASSEMBLY
语句的顺序。
不太好的消息(可能)
SQL 服务器检查 GAC 以查找在 SQL 服务器中引用的同名程序集。如果找到任何版本,它将检查版本号并且它们必须相同(即 SQL 服务器中的程序集与 GAC 中的程序集之间)。如果 SQL 服务器中的版本不同,您将收到错误消息。这意味着,如果您加载到 SQL 服务器的任何 .NET Framework 程序集通过 Windows 更新(甚至手动更新 .NET)进行更新,那么您可能需要删除这些程序集并使用当前版本重新加载它们。