CLR函数迁移如何从程序集中提取代码

问题描述

我需要迁移 sql Server 的实例,发现我在任何地方都没有一些 CLR 函数的源代码,我看到汇编中的函数并知道它们的逻辑:

select * from sys.assembly_modules

是否可以从中提取代码,所以我将其存储在新添加的TFS中。

实际上现在的主要任务是在新服务器上拥有相同的 CLR 功能,所以可能只是迁移程序集就可以完成这项工作?或者这需要做一些额外的步骤?

如果逆向工程不起作用,我可能会在第 2 步尝试重新创建源代码

enter image description here

谢谢

解决方法

SQLCLR 函数是程序集的一部分。一个程序集可以包含多个功能。它可以(理论上)由多个文件组成,尽管这是不寻常的。

你可以通过这个获取实际的 DLL 文件

SELECT
  a.name AssemblyName,f.name FileName,f.content Dll
FROM sys.assemblies a
JOIN sys.assembly_files f ON f.assembly_id = a.assembly_id
-- if you want to filter to certain SQLCLR functions
/*
WHERE a.assembly_id IN (
    SELECT *
    FROM sys.assembly_modules m
    WHERE m.object_id = OBJECT_ID(N'YourFunction')
)
*/

您可以使用您喜欢的 .NET 反编译器反编译 DLL。

如果您只想传输它们,您可以将它们作为 CREATE ASSEMBLY FROM 后跟二进制数据提交到源代码控制

,

让 Charlieface 的第二个推荐更明确,只需转移程序集。您可以通过 SSMS 执行此操作,方法是在对象资源管理器中选择程序集并从上下文菜单中选择“脚本程序集为...”。当然,由于这只是在后端使用 SMO,您也可以通过编写一些脚本来完成此操作。这是一个快速而肮脏的 powershell 脚本(`Get-DbaDatabase 来自总是令人愉快的 dbatools 模块)。

$db = Get-DbaDatabase -SqlInstance yourServer -Database yourDB;
foreach ($a in ($db.Assemblies | where IsSystemObject -eq $false)){
    $a.Script();
}