Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выбор типа репликации  [new]
Jarikk
Member

Откуда:
Сообщений: 4
Есть задача запустить несколько серверов с одинаковыми базами. С каждой базой будет работать отдельное приложение, изменение данных может происходить любым из приложений и данные должны синхронизироваться со всеми остальными базами в режиме реального времени. Топология дерева не более 2-го уровня.
Остановился на двунаправленной репликации транзакций. Не знаю, насколько ли хорош этот выбор ?.
Столкнулся с проблемой обнаружения конфликтов при обновлении данных. Как можно это сделать на основе уровня сервера в дереве, чтобы при конфликте приоритетным было обновление с уровня выше?
16 янв 14, 20:03    [15426678]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа репликации  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Jarikk
Топология дерева не более 2-го уровня.
Поясните, что за топология такая?
Jarikk
Столкнулся с проблемой обнаружения конфликтов при обновлении данных. Как можно это сделать на основе уровня сервера в дереве, чтобы при конфликте приоритетным было обновление с уровня выше?
Написать свой собственный разрешитель конфликтов можно только для merge-репликации.
16 янв 14, 21:12    [15426923]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа репликации  [new]
Jarikk
Member

Откуда:
Сообщений: 4
Есть сервер A (уровень 0), репликация на сервер B и сервер C (уровень 1), сервер B реплицируется на сервер D (уровень 2). Изменения на сервере D, к примеру, синхронизируются со всеми остальными.

Настраиваем сервер A:
USE [testDB]
GO

CREATE TABLE [test](
	[test_ID] INT IDENTITY (1, 100) NOT FOR REPLICATION PRIMARY KEY,
	[intcol] INT
)
GO

USE [master]
GO
EXEC sp_adddistributor @distributor = @@SERVERNAME
EXEC sp_adddistributiondb @database = 'distribution'
GO
EXEC sp_adddistpublisher @publisher = @@SERVERNAME, @distribution_db = 'distribution', @working_directory = '<Directory>'
GO
EXEC sp_replicationdboption N'testDB', N'publish', TRUE
GO

USE [testDB]
GO

EXEC sp_addlogreader_agent @publisher_security_mode = 1

EXEC sp_addpublication @publication = 'TestPub', @restricted = N'false', @status = N'active',
	@allow_push = N'true', @allow_pull = N'true', @independent_agent = N'true', @autogen_sync_procs = N'false';

EXEC sp_addarticle @publication = N'TestPub', @article = N'test', @source_object = N'test',@schema_option = 0xF1,
    @ins_cmd = N'CALL sp_ins_test', @del_cmd = N'CALL sp_del_test', @upd_cmd = N'XCALL sp_upd_test';
GO

-- INSERT Stored Procedure
CREATE PROCEDURE [sp_ins_test] (@test_ID INT, @intcol  INT)
AS
	SET IDENTITY_INSERT [test] ON

	INSERT INTO [test] ( [test_ID], [intcol] ) VALUES (@test_ID, @intcol)

	SET IDENTITY_INSERT [test] OFF
GO

--  DELETE Stored Procedure
CREATE PROCEDURE [sp_del_test] (@test_ID INT)
AS
	DELETE [test] WHERE [test_ID] = @test_ID
GO

--UPDATE Stored Procedure
CREATE PROCEDURE [sp_upd_test] (@old_test_ID INT, @old_intcol  INT, @test_ID INT, @intcol INT)
AS
	DECLARE @isHighLevelServer BIT
	SET @isHighLevelServer = 0

	UPDATE [test]
	SET
		[intcol] = CASE WHEN @old_test = [intcol] OR @isHighLevelServer = 0 THEN @intcol ELSE [intcol] END
	WHERE
		[test_ID] = @test_ID
GO

EXEC sp_addsubscription @publication = N'TestPub', @subscriber = '<Server B>', @sync_type = N'none', 
	@status = N'active', @loopback_detection = 'true';
GO


тем же образом настраиваем остальные сервера и связываем друг с другом. При создании таблицы используем [test_ID] INT IDENTITY (2..99, 100).
Если серверов второго уровня в схеме не будет, то переменную @isHighLevelServer в процедуре [sp_upd_test] можно определить, например, из Extended Properties базы. Но как узнать в процедуре [sp_upd_test], которая выполняется на сервере В, с какого сервера пришло обновление - с А или D?
Может можно как-нибудь добавить дополнительный параметр в процедуру [sp_ins_test], который будет передаваться с обновленными данными на подписчика? Пробовал использовать @sync_object в sp_addarticle и создавать View с дополнительной колонкой, но этот параметр передается в сторку [sp_upd_test] всегда NULL.
17 янв 14, 11:55    [15428920]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа репликации  [new]
invm
Member

Откуда: Москва
Сообщений: 9400
Jarikk
Но как узнать в процедуре [sp_upd_test], которая выполняется на сервере В, с какого сервера пришло обновление - с А или D?
Только добавив в таблицу столбец, идентифицирующий источник изменений.
17 янв 14, 12:57    [15429467]     Ответить | Цитировать Сообщить модератору
 Re: Выбор типа репликации  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5133
invm
разрешитель конфликтов можно только для merge-репликации.

Вот в принципе весь ответ на ваш вопрос.
В нам тип репликации указан + с конфликтами разберетесь, это не сложно.
17 янв 14, 15:14    [15430678]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить