如何更改订户架构?

时间:2011-07-18 19:32:36

标签: sql sql-server sql-server-2008 database-replication

我目前正在开发一个原型,允许客户端更新订户数据库架构,以便最终可以更改订户以匹配其应用程序的新版本,然后在部署前端代码时切换到该数据库。

我希望我可以发布架构更改(例如,更改列数据类型),同时使复制存储过程保持最新,以正确转换任何复制数据。虽然订阅者可能对正在更新的大表保持锁定,但它可能只是将发布者的更改排队,而不是导致仍在运行的应用程序出现锁定问题。我希望我能够解释得这么好......

这是我试过的:

BEGIN TRANSACTION

BEGIN TRY

UPDATE dbo.Big_Table SET some_string = REPLACE(some_string, ',', '')

ALTER TABLE dbo.Big_Table ALTER COLUMN some_string INT

DECLARE @sql VARCHAR(MAX)

SET @sql = 'create procedure [dbo].[sp_MSins_dboBig_Table]
    @c1 bigint,
    @c2 varchar(20),
    @c3 varchar(30)
as
begin
    declare @c2_new int

    set @c2_new = cast(replace(@c2, '','', '''') as int)

    insert into [dbo].[Big_Table] (
        [my_id],
        [some_string],
        [another_string]
    )
    values (
        @c1,
        @c2_new,
        @c3
    )
end    -- '

EXEC(@sql)

COMMIT TRANSACTION

END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
END CATCH

此特定脚本会将包含数字数据的VARCHAR列更改为INT,同时删除可能包含在“1,325”之类的数字中的逗号。

问题是,这也会导致发布者阻止。我见过references to pausing replication,但没有一个具体的步骤可以遵循(我没有很多复制经验)。通常,“关闭一些工作”。

我还看到了page on switching updating modes,但我认为仅适用于可更新的订阅者。

有关如何处理这种情况的任何建议?

1 个答案:

答案 0 :(得分:0)

如果发布者和订阅者架构不匹配,您现在如何设置复制?这是一个非常“有趣”的设置。一般来说,搞乱默认程序会引起头痛。因为它们是系统维护的,所以你的新版本可以在任何时候被覆盖(虽然在实践中,这不会发生)。如果您没有更新订户,则应将订户视为只读,以免破坏复制。也许我错过了一些东西。