我们inheritance了传统的SQL 2005数据库。 其中一个数据库中的触发器使用了两个程序集(ouch)。 该文件夹/文件被错误地删除。 他们是由他的桌面文件夹中的前一名员工安装的,并没有检查到源代码pipe理(双ouch)。 现在,DLL已经不存在了,我们担心重启。 SQL 2005是否以这种方式复制/重命名/存储这些DLL,这将意味着重新启动服务器不会产生问题?
你很幸运,如果原来部署的程序集只是简单的丢失,你仍然可以将程序集二进制文件导出为hexstring。
1.打开SSMS并导航到Programmability – > Assemblies。 你应该看到你的注册会议,我用红色突出显示了我的。

2.右键单击程序集并将其编写到新的查询窗口中:

当你这样做的时候,你会看到这样的事情:
CREATE ASSEMBLY [Microsoft.SqlServer.Types] AUTHORIZATION [sys] FROM 0x4D5A90000300000004000000FFFF0000B800000000000000400000000...[snipped] WITH PERMISSION_SET = UNSAFE
FROM 0x4D5A90000...的行是实际汇编编码为一个大的hexstring。 看下面如何导出回文件格式。
确保你也脚本的任何function,触发等依赖于这个大会。 您可以通过在SSMS中的程序集上执行“View Dependencies”来查找它们。
您应该能够重新启动服务器而不受惩罚,因为程序集是从一个系统数据库表(谁的名字我无法再记住,但通过sys.assembly_files系统视图可见的程序集)存储和加载,而不是在文件系统上。
但是,如果你不想重启信心,那么按照上面的描述进行导出,然后在另一个SQL 2005实例上重新创build,以确保一切都完好无损。
基于我在这个线程中find的答案,您可以将注册的程序集导出回常规文件。 如果使用Visual Studio来部署程序集,则可能还会有一些源代码对象存储在SQL Server中,这当然是一种奖励。 例如,我从VS2010部署后,查询了我的开发服务器,我发现这个:
SELECT * FROM sys.assembly_files

正如你所看到的,有几个文件与SqlServerProject2 ( assembly_id = 65540 )相关联。 我们可以通过运行这个脚本来导出它们全部:
DECLARE @assembly_id int, @name nvarchar(260), @content varbinary(MAX) DECLARE @ObjectToken INT, @outputdir nvarchar(20) -- Get assembly id from querying sys.assembly_files SET @assembly_id = 65540 -- IMPORTANT: SET THIS VALUE SET @outputdir = 'D:\Data\Assemblies\' -- AND THIS PATH DECLARE assy_cursor CURSOR FOR SELECT name, content FROM sys.assembly_files WHERE assembly_id = @assembly_id OPEN assy_cursor FETCH NEXT FROM assy_cursor INTO @name, @content WHILE @@FETCH_STATUS = 0 BEGIN SET @name = @outputdir + REPLACE(@name, '\', '-') print 'Saving: ' + @name EXEC sp_OACreate 'ADODB.Stream', @ObjectToken OUTPUT EXEC sp_OASetProperty @ObjectToken, 'Type', 1 EXEC sp_OAMethod @ObjectToken, 'Open' EXEC sp_OAMethod @ObjectToken, 'Write', NULL, @content EXEC sp_OAMethod @ObjectToken, 'SaveToFile', NULL, @name, 2 EXEC sp_OAMethod @ObjectToken, 'Close' EXEC sp_OADestroy @ObjectToken FETCH NEXT FROM assy_cursor INTO @name, @content END CLOSE assy_cursor DEALLOCATE assy_cursor
您将需要设置这两个variables:
SET @assembly_id = 65540 SET @outputdir = 'D:\Data\Assemblies\'
@outputdirpath将需要在SQL Server有权写入的地方。
当你执行这个脚本时,你最终会得到一个或多个文件。 如果你没有所有的源代码,那么你总是可以使用.NETreflection器反编译输出的程序集。
注意:在SQL Server中默认禁用OLE自动化( sp_OAxxxxx存储过程),但可以通过执行以下命令来启用它:
use master go sp_configure 'show advanced options', 1; GO RECONFIGURE; GO sp_configure 'Ole Automation Procedures', 1; GO RECONFIGURE; GO