1

我想将旧数据库中的父表和子表中的数据迁移到新数据库中的类似表中。旧模式和新模式是不同的。

在旧数据库中,父条目具有 (ID, ...),子条目各具有 (ID, pid, ...),其中 pid 是相应父行的 ID。

问题是,如何让它们连接到目标数据库?我被困住了。我曾认为这样做的方法是为每个元素创建一个将 oldID 映射到 newID 的表;但是,我无法弄清楚如何使用触发器、输出子句或我看过的其他任何东西来做到这一点。

我还想迁移其他表,以便 oldID 到 newID 映射表会很方便。除非有更好的解决方案。

进一步解释......旧数据库中有外键关系需要保留在新数据库中。但是当一行被复制到新数据库时,它会得到一个新的 PK。子表中的行具有父行的旧 PK 作为 FK。为了将子行从旧数据库复制到新数据库中,我必须使用父数据库的旧 PK 从旧数据库中选择它们,但使用父数据库的新 PK 将它们插入新数据库。那是我无法弄清楚如何使用 SQL 的部分。

谢谢,埃里克

4

3 回答 3

1

我们不能只用旧数据库中的 SELECT 为新数据库编写一个 INSERT 查询吗?

像这样的东西应该工作:

INSERT INTO NewDB.schema.TableName (newCol1, newCol2, ... ,newColN)
SELECT oldCol1, oldCol2, ... , oldColN 
FROM OldDB.schema.TableName

我还认为ApexSQL Data DiffSQL Data Compare等高端数据比较工具提供了某种高级表映射,可让您自动执行此操作。我真的不认为你需要这些工具中的任何一个,但它们可能会很有用。

于 2013-02-13T14:33:47.540 回答
0

这是另一种方法:

只需IDMap向目标数据库表中添加一列,根据连接插入相关表到IDMap.

例如对于表

CREATE TABLE db1.dbo.Parent
(
  Id int identity,
  description varchar(max),
  PRIMARY KEY(Id)
)

CREATE TABLE db1.dbo.Child
(
  Id int identity,
  ParentId int NOT NULL,
  SomeChar char(1),
  PRIMARY KEY(Id),
  FOREIGN KEY(ParentId) REFERENCES db1.dbo.Parent(Id)
)

CREATE TABLE db2.dbo.Parent
(
  Id int identity,
  description varchar(max),
  PRIMARY KEY(Id)
)

CREATE TABLE db2.dbo.Child
(
  Id int identity,
  ParentId int NOT NULL,
  SomeChar char(1),
  PRIMARY KEY(Id),
  FOREIGN KEY(ParentId) REFERENCES db2.dbo.Parent(Id)
)

您的导入脚本可能是:

ALTER TABLE db2.dbo.Parent ADD IDMap INT
--might consider adding an index for performance, might help, might hurt.
GO

INSERT INTO db2.dbo.Parent (description, IDMap)
SELECT description, Id FROM db1.dbo.Parent

INSERT INTO db2.dbo.Child (ParentId, SomeChar)
SELECT db2.dbo.Parent.Id, db1.dbo.Child.SomeChar
FROM db1.dbo.Child
INNER JOIN db2.dbo.Parent ON db2.dbo.Parent.IDMap = db1.dbo.Child.ParentId

这是一个演示上述内容的SQL Fiddle(由于 sql fiddle 限制,严格来说不是跨数据库,但应该给你这个想法。)

然后,您可以删除该IDMap列,或者如果您希望将其保留以供后代使用。

于 2013-02-15T05:44:42.303 回答
0

好的,我有一个解决方案;但是,它似乎如此编码。无论如何,在以下循环运行后,fidToGroupId 表可以将旧的 DB ID 映射到新的 DB ID。现在,FK 曾经指向旧 Family ID 的家庭成员现在可以通过 JOIN 映射到新的 Group ID 并插入到新的 DB 中

我希望有一个更优雅(并且不那么乏味!)的解决方案,而不是像这样打磨行。

use phdb 

declare @GroupId int
declare @UserId int
declare @ClientId char( 11 )

select @ClientId = min( ID ) from mcndb.dbo.tClient where IsPerson=0
while @ClientId is not null
begin
    -- Old.Family becomes New.Group
    insert into Groups (GroupName, GroupKind)
        select (fname + ' ' + lname) as GroupName, 'Family' 
            from mcndb.dbo.tClient where ID = @ClientId
    set @GroupId = SCOPE_IDENTITY()

    -- Map fid to GroupId for later use
    insert into mcndb.dbo.fidToGroupId (fid, GroupId)
    values (@ClientId, @GroupId)

    -- Create a user for parent of the family group 
    insert into Users (FirstName, LastName, IsFemale, DoB, ProviderUserKey)
        select fname, lname, 0, '1977-07-07', '00000000-0000-0000-0000-000000000000'
            from mcndb.dbo.tClient where ID = @ClientId 
    set @UserId = SCOPE_IDENTITY()

    -- Connect the parent into the group
    insert into UsersInGroups (Group_ID, [User_ID], [Role])
        values (@GroupId, @UserId, 'PayingParent')

    -- Next row
    select @ClientId = min( id ) from mcndb.dbo.tClient 
        where ID > @ClientId and IsPerson = 0
end
于 2013-02-14T21:10:36.803 回答