将数据从登台表移动到活动表,同时保持一对多关系

时间:2011-01-12 15:49:39

标签: sql sql-server database stored-procedures

我有一个具有两个一对多关系的数据库结构。我有一个网站,有很多主题,每个主题都有很多问题。这导致三个数据库表,每个数据类型一个。

我正在做的是实施一个临时区域 - 我可以在这里对这些网站进行更改,而不会影响实时网站。因此,我复制了表结构,目的是编辑重复项,并在更改准备好后将更改推送到实时版本。我想在一个存储过程中执行此操作,但我无法弄清楚如何维护主题与其问题之间的关系。

该网站具有除ID以外的识别功能,因此很容易找到该网站的实时版本,并更新其信息,甚至将该网站的主题从登台表转移到实时表格。

以下是我的推动计划的伪代码:

-- pass in the ID of the staging website
-- get the ID of the live website
-- update live website data from staging website data
    -- this is a strict update - if there is a staging version, there will necessarily be a live version
-- delete all live subjects
-- delete all live questions
-- copy subjects from staging to live
-- copy questions from staging to live

请注意,除了编辑之外,可以添加或删除主题和问题(因此,删除和重新插入似乎是最佳行动方案)。

我已经能够为大部分内容编写实际代码,因为它相对简单。但是弄清楚如何维持主体和问题之间的关系一直是个问题。如果我在服务器端脚本语言中这样做,我会做这样的事情(再次,伪代码):

for each subject
    copy information from staging subject to live subject
    get id of new live subject
    for each question in this subject
        copy information from staging to live, setting subject ID to new live ID

正如我所说的,我想将这一切保存在同一个存储过程中。如果这是不可能的,那么我显然会选择上面的版本,但为了提高效率,我宁愿没有几个数据库命中。

1 个答案:

答案 0 :(得分:1)

您不必为每一行创建新标识。您可以在暂存时重复使用您的身份。

假设您已设置链接服务器,则可以执行以下操作

SET IDENTITY_INSERT MYTABLENAME ON

INSERT INTO MyTableName  (IdenityColumn, Col1, Col2, Col3) 
SELECT StagingIdentityColumn, StagingCol1, StagingCol2, StagingCol3
FROM StagingServer.StagingDatabase.DBO.MyTableName

SET IDENTITY_INSERT MyTableName OFF

当然,现在您必须以正确的顺序插入,以便保持参照完整性。