【问题标题】:Merging databases - Identity column drop合并数据库 - 身份列删除
【发布时间】:2011-04-27 09:37:23
【问题描述】:

我需要创建一个能够合并客户生产数据库的工具。 通常这些数据库将具有相同的模式(我稍后会做一些检查,但现在我们假设它是)。过滤重复数据也是以后的事情。 这需要自动完成(因此无需通过 SSMS 等生成脚本)。 我已经不得不重新开始几次了,因为每次我遇到一些我没有想到的问题,所以这次我想在重新开始之前征求你们的意见。

我目前的行动计划是:

  • 从数据库 1 复制模式(稍后我将在此处添加一些检查 当架构不同时
  • 遍历所有表并将所有外键更新设置为级联,并且 设置 tabledata 需要插入的顺序(所以 首先包含 PK 的表,然后是包含 FK 的表)
  • 以正确的顺序循环每个表

    • 在数据库 2 表中检查标识列,如果是,则检索 数据库 1 中相应表中的当前种子值,删除 数据库 2 表上的标识属性并将每个 ID 更新为 newID = currentID + 种子(避免以后出现重复的主键)
    • 为数据库 1 表生成插入脚本(SMO 的 Table.EnumScript)
    • 为数据库 2 表生成插入脚本(SMO 的 Table.EnumScript)
    • 在新数据库上执行数据库 1 中的每一行插入脚本
    • 执行数据库 2 插入脚本中的每一行(现在有主 新数据库上将遵循数据库 1) 中的键/身份字段数据
  • 转到下一张表

测试时一切正常(禁用 SSMS 中的标识属性,创建 T-SQL 脚本以使用给定种子更新每一行,..) 但现在的问题是在 C# 中自动执行此操作,更具体地说是禁用标识属性。似乎没有一个干净的解决方案。创建一个新表并重建每个约束等似乎是错误的方式,因为我需要它的唯一原因是级联每个 FK,所以一切仍然指向正确的位置..

另一种方法是延迟身份列数据的更新,并在脚本生成之后和插入新数据库之前对其进行更改。但是我需要知道哪些数据指向哪些其他数据,而所有内容仍然在字符串中(插入脚本)?

关于如何处理此问题的任何建议、想法或技术?

我知道Red Gate的SQL比较,确实很棒,但需要自己编程。

使用:SMO、SQL Server 2005 - 2008R2(客户端服务器上没有开发人员或企业版)、ADO.NET、C#、.NET framework 2.0、Visual Studio 2008

【问题讨论】:

  • 要链接没有标识的行,您可以使用 GUID 作为非键列。
  • 我写了一个 ETL 来做这个,没有删除 IDENTITY 属性。我添加了一个虚拟列来跟踪旧 ID 并将它们插入到地图中,然后我更新了地图上的所有 FK。长话短说,我没有看到你在这里处理的一个问题是循环引用。

标签: c# .net sql-server tsql smo


【解决方案1】:

我不确定您在此处尝试通过您的流程完成什么,但管理数据库版本是我非常感兴趣的事情。
看看 DBSourceTools (http://dbsourcetools.codeplex.com)。
它是一个将整个数据库脚本写入磁盘的实用程序,包括所有外键约束和数据。
使用部署目标,您将能够在另一台数据库服务器(通常是本地计算机)上重新创建这些数据库。
该工具将使用 Sql Bulk insert 处理依赖项和大型数据库表 - 尝试生成包含 50,000 个插入语句的脚本将是一场噩梦。
玩得开心。

免责声明:我参与了http://dbsourcetools.codeplex.com 项目。

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 1970-01-01
    • 2019-07-21
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 2011-11-18
    • 2017-05-31
    • 2019-07-01
    相关资源
    最近更新 更多