2014-02-14 22 views
1

我们目前正在研究以下过程,其目标是在维护FK的同时在两组数据库服务器之间移动数据并处理目标表已经具有的事实在T-SQL中保留用于数据迁移的标识值的干净块

  1. 从“根”表中提取的一组行和所有它的子表FK相关联的数据正级别深度与可驻留在上的其他数据库相关行沿着:具有重叠标识列的值的行来自源数据库服务器的相同实例。
  2. 将提取的数据集放入目标数据库服务器上的一组登台表中。
  3. 通过为目标表保留标识块并更新所有相关的子登台表来重新登记登台表中的数据(这些登台表中的每个表都将具有与源/目标表相同的模式,并增加一个“lNewIdentityID “栏)。
  4. 以正确的顺序将具有新身份的数据插入到目标表中(选项SET IDENTITY_INSERT'desttable'ON将被明显使用)。

我正在努力与这个过程(#3)的块保留部分。我们的系统几乎是一个24小时系统,除了一个短暂的每周维护窗口。管理需要这个过程,而不必每周都等待维护窗口在服务器之间迁移数据。话虽如此,我可能有100个插入交易与我们的迁移过程竞争,而它在#3。下面是我试图保留身份标识的一个尝试,但我担心在“SET @ newIdent ...”和“DBCC CHECKIDENT ...”之间插入事务将完成,并且迁移过程不会在一个已知范围内有一个“干净的”身份标识块,可以用它来重新输入登台数据。

我基本上需要锁定表格,获取当前身份,增加身份,然后解锁表格。我不知道如何在T-SQL中做到这一点,并且正在寻找想法。谢谢。

IF EXISTS (SELECT TOP 1 1 FROM sys.procedures WHERE [name]='DataMigration_ReserveBlock') 
    DROP PROC DataMigration_ReserveBlock 
GO 

CREATE PROC DataMigration_ReserveBlock (
    @tableName varchar(100), 
    @blockSize int 
) 
AS 
BEGIN 
    SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 

    DECLARE @newIdent bigint; 
    SET @newIdent = @blockSize + IDENT_CURRENT(@tableName); 

    DBCC CHECKIDENT (@tableName, RESEED, @newIdent); 

    SELECT @newIdent AS NewIdentity; 
END 
GO 


DataMigration_ReserveBlock 'tblAddress', 1234 

回答

0

你可以在交易中

BEGIN TRANSACTION 
... 
COMMIT 

包裹它应该足够快,以不引起与其他插入过程中的问题。尽管包含try/catch逻辑是一个好主意,所以如果出现问题,可以回滚。