【问题标题】:How do you translate old SQL database data to a new table layout?如何将旧的 SQL 数据库数据转换为新的表布局?
【发布时间】:2013-06-26 16:49:11
【问题描述】:

我们有一个旧数据库,其表结构经过深思熟虑,几乎没有关系设置,也没有命名方案。我创建了一个新的数据库,该数据库具有干净的关系数据结构,实现了正确的设计实践。

我正在寻找有关将旧数据迁移到新格式的不同方法的建议。这将需要大量的数据重塑,这不会很有趣。数据被大量访问,挑战将是使所有相关数据(帐户、重要服务等)的两个数据库保持同步。

我认为触发器可能是这里的方法 - 但也许有一种我不知道的不同方法(可能是 MS Sync Framework,或代码级数据适配器,因为数据太多,所以工作量更大访问代码遍布各处,经典的 ASP 和 .Net 遍布数十个项目)。有问题的数据库是 SQL Server 2005,在 SQL Server 2000 兼容模式下运行。

【问题讨论】:

  • 我个人会编写一个程序来移动数据,并对其进行测试,直到结果如您所愿。然后,当您想上线时,您可以在停机期间运行它并完成工作。您确实需要彻底测试,特别是如果大量更改结构并且您正在新数据库中添加参考完整性规则。如果数据库写得不好,那么运行在它上面的软件很有可能也是。
  • 是的,软件也写得不好。这是公司与许多不同的开发人员长期开发事物的情况之一。以一团糟告终。使用迁移应用程序一次迁移数据并不是一个真正的选择,因为旧系统将保留一些旧产品,而新产品会迁移到新系统。
  • 我的一个想法是在新数据库中创建一个“适配器”架构,该架构将包含将旧主键与新主键相关联的表,并允许在两个数据库之间保持数据同步二。新系统不会更新旧系统,但对旧系统的更改总是会完全使用触发器传播到新系统。

标签: sql sql-server sql-server-2005 database-design data-binding


【解决方案1】:

我认为要走的路是在新数据库中编写一个存储过程,它实际上会拉动您的 delta 更改(仅从上次运行到存储的那一刻所做的修改) proc 运行),并将此存储过程放入 sql 代理作业中。

将 sql 代理作业配置为每 15 分钟运行一次,并让数据同步进来。

在这种情况下使用触发器的缺点

触发器会降低性能,因为 sql server 将执行触发器代码以及更新/插入/删除语句,并且每次都将这些作为执行的一部分,即如果您的触发器代码需要 2 秒执行,没有触发器的更新语句执行需要2秒,那么更新时间将增加到4秒,触发器到位。因此,在这种情况下使用触发器可能会导致巨大的性能瓶颈。

【讨论】:

  • 我听到了......关于如何确定 delta 的任何建议?使用触发器肯定会影响性能,我猜这里可以使用行版本控制来确定哪些行已更改。但是,性能也可能会受到影响,因为我可能需要比较数百万行的版本更改。
  • 你能告诉我们你正在使用什么 sql server 版本(2005,2008...)和版本(Developer / Standard / Enterprise....)。
【解决方案2】:

我在工作中遇到了同样的情况,我目前正在编写一个应用程序来进行迁移。原始数据库没有建立关系,所以它真的就像一组断开的电子表格。通过构建自己的应用程序,我能够使用新建立的外键迁移数据,并分配特定于数据的默认值来代替空值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 2021-02-05
    相关资源
    最近更新 更多