12

这是这种情况:

我有一个 Trigger.dll 和一个 Trigger.XmlSerializer.dll。

我使用 CREATE ASSEMBLY 在 MSSQL 中注册它们。

现在,我已经编译了两者的新版本。

我想使用 ALTER ASSEMBLY 来更新它们,但是您一次只能更新一个。如果您尝试更新具有依赖关系的一个,它会抱怨。这样做有什么诀窍?

我不想删除并重新创建,因为我必须删除所有触发器等,并且存在数据库停机时间。

4

3 回答 3

5

根据微软的支持,您可以通过技巧使用它。

笔记

  • 这些步骤在“如何升级或降级程序集”部分中描述的方案中升级或降级程序集 A。
  • 此示例假定两个程序集的版本都是 1.0.0.0,并且程序集都是用 C# 编写的。当您按照这些步骤操作时,您尝试将程序集 A 和程序集 B 升级到版本 2.0.0.0。

要升级或降级程序集 A,请执行以下步骤。

  1. 将程序集 B 的 1.0.0.0 版本备份到文件夹。
  2. 修改然后将程序集 B 重新编译到版本 2.0.0.0。
  3. 使用 ALTER ASSEMBLY 语句升级 SQL Server 2005 中的程序集 B。
  4. 修改程序集 A 并将其重新编译为版本 2.0.0.0。执行此操作时,请从您在步骤 1 中创建的备份中引用程序集 B 的 1.0.0.0 版本。为此,请使用 Csc.exe 编译器工具和 /reference 开关。例如,使用以下命令: csc /target:library /out:AssemblyA.dll AssemblyA.cs AssemblyInfo.cs /reference:"BackupFolder\AssemblyB.dll" 注意 要在程序集 A 的元数据中验证程序集 B 的版本,使用 Ildasm.exe 实用程序打开程序集 A。然后,验证 MANIFEST 部分下所引用程序集的元数据信息。
  5. 使用 ALTER ASSEMBLY 语句升级 SQL Server 2005 中的程序集 A。
于 2009-02-11T00:50:55.717 回答
1

我担心丢掉桌子并重新创建它是唯一的方法。

造成这种情况的主要原因是,如果将程序集更新到新版本,则存储在程序集中的类型中的值将不可用。

于 2009-02-05T10:58:47.983 回答
0

两个建议:

1) 通常,您可以通过使用 ILMerge 嵌入和内部化它们来避免依赖关系。所以在大多数情况下,alter 汇编语句应该足够了。我自己还没有用 SQLCLR 尝试过,但我会试一试。

2) 也许不需要 XML 序列化程序集?本文建议仅在 SQL Server 内部调用外部 Web 服务时才需要。这本身就是一个有问题的设计,除非您是那些想要在 MS SQL Server 产品中托管所有业务服务的人之一,而不是仅仅在 Windows 中编写自己的独立服务(更容易安装、管理和维护),即比“数据层无所不能”反模式更多的 n 层模式。由于您的 DLL 称为 Triggers.dll,因此不建议它声明任何类型或作为 Web 服务代理。如果我错过了使用 XML 序列化程序的其他一些原因,那很公平,请出于兴趣详细说明。

于 2013-09-27T08:51:53.637 回答