Да, это возможно.Фактическое двоичное представление сборок находится в каталоге SQL для вашего сервера.А именно, если вы запустите соединение между sys.assembly_files и sys.assemblies, вы сможете получить всю необходимую вам информацию.Двоичный файл сборок находится в столбце содержимого представления sys.assembly_files.
Но чтобы извлечь двоичное представление из SQL Server в файл на диске, вам нужно написать некоторый код .NET, который должен выполняться в той же базе данных, где сейчас находятся сборки, на которые вы ссылаетесь.В Visual Studio запустите проект SQL CLR и добавьте в него класс со следующим кодом:
using System;
using System.IO;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
using System.Security.Permissions;
namespace ExtractSqlAssembly {
[PermissionSet(SecurityAction.Demand, Unrestricted = true, Name = "FullTrust")]
public partial class SaveSqlAssembly {
[SqlProcedure]
public static void SaveAssembly(string assemblyName, string path) {
string sql = @"SELECT AF.content FROM sys.assembly_files AF JOIN sys.assemblies A ON AF.assembly_id = A.assembly_id where AF.file_id = 1 AND A.name = @assemblyname";
using (SqlConnection conn = new SqlConnection("context connection=true")) {
using (SqlCommand cmd = new SqlCommand(sql, conn)) {
SqlParameter param = new SqlParameter("@assemblyname", SqlDbType.VarChar);
param.Value = assemblyName;
cmd.Parameters.Add(param);
cmd.Connection.Open(); // Read in the assembly byte stream
SqlDataReader reader = cmd.ExecuteReader();
reader.Read();
SqlBytes bytes = reader.GetSqlBytes(0);
// write the byte stream out to disk
FileStream bytestream = new FileStream(path, FileMode.CreateNew);
bytestream.Write(bytes.Value, 0, (int)bytes.Length);
bytestream.Close();
}
}
}
}
}
Затем соберите проект и разверните его в своей базе данных.Убедитесь, что опция конфигурации CLR Enabled включена на SQL Server.Это, вероятно, уже включено, так как у вас есть сборки на нем.В случае, если выполнение clr не включено, вы можете запустить следующий код в SSMS, чтобы включить его:
sp_configure 'clr enabled', 1
go
reconfigure
go
Еще одна вещь, о которой вам нужно знать, это то, что по умолчанию SQL-сервер может не разрешать записьна диск из .NET кода.Если вы получили ошибку безопасности FileIO при запуске приведенного выше кода при вызове хранимой процедуры в SSMS, вам потребуется настроить правильный набор разрешений для сборки.Вы можете сделать это через SSMS: щелкните правой кнопкой мыши новую сборку и посмотрите на Набор разрешений в диалоговом окне Свойства.Установите его на внешний доступ.Теперь вы сможете экспортировать сборки, запустив следующий код в SSMS:
exec SaveAssembly 'AssemblyName', 'f:\path\to\assemblyname.dll'
Надеюсь, это работает для вас ...