2009-02-05 52 views
12

这种情况:如何在MS-SQL中更新程序集及其相关程序集?

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

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

现在,我编译了两个版本。

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

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

+0

你的sql版本是什么? – Avram 2009-02-11 00:12:58

回答

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“ 注意要验证程序集元数据中程序集B的版本A,通过使用Ildasm.exe实用程序打开程序集A.然后,在MANIFEST部分下验证引用程序集的元数据信息。
  5. 使用ALTER ASSEMBLY语句升级组件中的SQL Server 2005中
1

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

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

0

两个建议:

1)一般来说,你可以通过使用ILMerge嵌入和内他们避免依赖。所以在大多数情况下,修改汇编语句应该足够了。还没有用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序列化器的其他原因,那么请详细说明这一点。

相关问题