【发布时间】: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