3

我有一个简单的情况。一个大型组织正在使用某些(桌面)应用程序的几个不同版本,每个版本都有自己的数据库结构。大约有 200 个办公室,每个办公室都有自己的版本,可以是 7 个不同的版本之一。该公司希望将所有应用程序升级到最新版本,即版本 8。

问题是他们没有为每个版本提供单独的数据库。他们也没有为每个办公室提供单独的数据库。他们有一个由专用服务器处理的单一数据库,从而使管理和备份等事情变得更容易。每个办公室都有自己的数据库架构,并且在架构内有针对其特定应用程序版本的整个数据库结构。结果,我处理了 200 个需要升级的不同模式,每个模式都有 7 个可能的版本。幸运的是,每个模式都知道正确的版本,因此检查版本并不困难。

但我的问题是我需要创建可以从版本 1 升级到版本 2 到版本 3 等的升级脚本......基本上,所有模式都需要升级一个版本,直到它们都是版本 8。编写代码这样做是没有问题的。挑战是如何创建从一个版本到另一个版本的升级脚本?最好使用一些自动化工具。我检查了 RedGate 的 SQL Compare 和 Altova 的 DatabaseSpy,但它们并不实用。Altova 太慢了。RedGate 之后需要进行太多处理,因为生成的 SQL 脚本仍然有一些错误,并且它引用了模式名称。此外,代码需要成为存储过程的一部分,而 RedGate 生成的代码并不真正适合单个过程。(另外,它处理了太多事务,而我需要在单个事务中处理所有内容。


我一直在考虑使用另一个 SQL 比较工具,但在我看来,我的情况与标准工具可以提供的情况太不同了。所以我要写我自己的比较工具。为此,我将使用 ADOX 和 Delphi 来读取数据库中每个模式版本的目录,然后使用它来编写需要将这些模式升级到下一个版本的 SQL 语句。(比较 1 与 2、2 与 3、3 与 4 等)我对生成 SQL-Script-Generators 并不陌生,所以我预计不会有太多问题。而且我只会升级表结构,而不是任何其他数据库对象。

那么,在进行这种比较时,是否有人有一些好的提示和技巧可以应用?需要注意的事项?提高速度的实用技巧?

4

3 回答 3

2

我仍然认为 RedGate 是要走的路。确实,它并不总能捕获所有依赖项,您可能需要对其进行一些修改,但它可以让您完成 95% 的工作,并且会为 IMO 节省大量时间。

生成脚本后,您可以轻松破解错误处理和事务的完成方式,输出有很好的文档记录,因此查看发生了什么是微不足道的。

一种可能性是,而不是修改每个数据库,这样做:

  • 创建一个新的 8 版数据库 ( DB_NEW)
  • 迁移旧数据库中的所有数据 ( DB)(为此,您最多需要 7 个不同的数据迁移脚本)
  • 验证新数据库
  • 如果成功,重命名DBDB_OLD并重命名DB_NEWDB
于 2010-05-10T14:07:04.280 回答
1

创建新数据库然后迁移数据是最好的方法。可能您需要创建许多数据转换脚本,但我认为数据结构之间的差异并不大。迁移后,我建议使用任何允许比较 sql-query 结果的数据比较工具来验证迁移是否成功。

于 2010-05-12T14:56:02.827 回答
1

Redgate 就是答案,您可以比较不同的架构,并且还会根据差异为您生成脚本。

于 2010-05-15T19:39:42.307 回答