В настоящее время я работаю над прототипом, чтобы позволить клиенту обновить схему базы данных подписчика, чтобы в конечном итоге он мог изменить подписчика в соответствии с новой версией своего приложения, а затем переключиться на эту базу данных при развертывании кода переднего плана.
Я надеялся, что смогу внести изменения в схему (например, изменить тип данных столбца), в то же время сохраняя хранимые процедуры репликации в актуальном состоянии для правильного преобразования любых реплицированных данных. Хотя подписчик может удерживать блокировки на обновляемых больших таблицах, он может просто поставить в очередь изменения от издателя, вместо того чтобы вызывать проблемы с блокировкой во все еще работающем приложении. Надеюсь, я объясню это достаточно хорошо ...
Вот что я попробовал:
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".
Проблема в том, что это вызывает блокировку и у издателя. Я видел ссылки на паузу репликации , но ни у одного из них нет конкретных шагов, которым нужно следовать (у меня нет большого опыта репликации). Обычно это «отключить некоторые задания».
Я также видел страницу о переключении режимов обновления , но я думаю , которая относится только к подписчикам с возможностью обновления.
Любые предложения о том, как справиться с этой ситуацией?