SQL / Schema比较和升级

时间:2010-05-10 14:03:33

标签: sql-server-2005 delphi delphi-2007 adox

我的情况很简单。一个大型组织正在使用某些(桌面)应用程序的几个不同版本,每个版本都有自己的数据库结构。大约有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脚本生成器所以我不希望有太多问题。我只会升级表结构,而不是任何其他数据库对象。

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

3 个答案:

答案 0 :(得分:2)

我仍然认为RedGate是要走的路。确实,它并不总能捕获所有的依赖关系,你可能需要稍微破解它,但它会让你获得95%的路径,并且会成为一个巨大的节省时间的IMO。

一旦你生成了脚本,就可以轻松地破解错误处理和事务处理的方式,输出文档很好,所以看看发生了什么是微不足道的。

一种可能性是,而不是修改每个数据库,执行此操作:

  • 创建新版本8数据库(DB_NEW
  • 迁移旧数据库(DB)中的所有数据(为此需要最多7个不同的数据迁移脚本)
  • 验证新数据库
  • 如果成功,请将DB重命名为DB_OLD并将DB_NEW重命名为DB

答案 1 :(得分:1)

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

答案 2 :(得分:1)

Redgate就是答案,您可以比较不同的模式,并根据差异为您生成脚本。