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 程序集中使用 Microsoft Solver Foundation