我目前正在开发一个原型,允许客户端更新订户数据库架构,以便最终可以更改订户以匹配其应用程序的新版本,然后在部署前端代码时切换到该数据库。
我希望我可以发布架构更改(例如,更改列数据类型),同时使复制存储过程保持最新,以正确转换任何复制数据。虽然订阅者可能对正在更新的大表保持锁定,但它可能只是将发布者的更改排队,而不是导致仍在运行的应用程序出现锁定问题。我希望我能够解释得这么好......
这是我试过的:
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,但我认为仅适用于可更新的订阅者。
有关如何处理这种情况的任何建议?
答案 0 :(得分:0)
如果发布者和订阅者架构不匹配,您现在如何设置复制?这是一个非常“有趣”的设置。一般来说,搞乱默认程序会引起头痛。因为它们是系统维护的,所以你的新版本可以在任何时候被覆盖(虽然在实践中,这不会发生)。如果您没有更新订户,则应将订户视为只读,以免破坏复制。也许我错过了一些东西。