如何在MS-SQL中更新程序集及其相关程序集?

时间:2009-02-05 03:55:16

标签: sql-server sqlclr

情况就是这样:

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

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

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

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

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

3 个答案:

答案 0 :(得分:5)

根据microsoft support你可以通过技巧使用它。

注释

  • 这些步骤在“如何升级或降级程序集”部分中描述的方案中升级或降级程序集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.

答案 1 :(得分:1)

我担心放下桌子并重新创造它是唯一的方法。

这样做的主要原因是,如果将程序集更新为新版本,则存储在程序集中的类型中的值将无法使用。

答案 2 :(得分:0)

两个建议:

1)通常,您可以通过使用ILMerge嵌入和内化它们来避免依赖性。因此,在大多数情况下,alter assembly语句应该足够了。我还没有尝试过SQLCLR,但我会​​试一试。

2)也许不需要XML序列化程序集? This article suggests it is only necessary when calling external web services inside SQL Server。本身是一个值得怀疑的设计,除非您是那些想要在MS SQL Server产品中托管所有业务服务的人之一,而不仅仅是在Windows中编写自己的独立服务(更容易安装,管理和维护),即更多的n层模式比“数据层做一切”反模式。由于您的DLL名为Triggers.dll,因此不建议它声明任何类型或是Web服务代理。如果我错过了使用XML序列化程序的其他原因那么公平,请详细说明您的兴趣。