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

Posted

技术标签:

【中文标题】CLR 函数迁移如何从程序集中提取代码【英文标题】:CLR function migration how to extract code from assembly 【发布时间】:2021-09-13 23:31:16 【问题描述】:

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

select * from sys.assembly_modules

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

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

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

谢谢

【问题讨论】:

阅读:docs.microsoft.com/en-us/sql/relational-databases/… 这能回答你的问题吗? Extracting a .NET Assembly from SQL Server 2005 可能,为了满足您的要求,您需要使用代码创建另一个 CLR 程序集来提取 CRL 程序集;推荐讲座由@DaleK或本文Exporting CLR Assemblies from SQL Server back to .dll files以上推荐 【参考方案1】:

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 ,后跟二进制数据

【讨论】:

【参考方案2】:

让 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();

【讨论】:

以上是关于CLR 函数迁移如何从程序集中提取代码的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 中的 CLR 程序集 C#

从程序集中获取所需的运行时版本

在 SQL Server CLR 程序集中使用 Microsoft Solver Foundation

如何在 SQL Server 的 clr 存储过程中执行动态 .net 代码

应用程序集和CLR 垃圾回收

CLR详解CLR中的程序集