репликация между двумя таблицами с разными именами и с разными именами столбцов. Можно ли создать такую ​​репликацию - PullRequest
3 голосов
/ 18 апреля 2011

У меня есть требование, где я должен создать репликацию между двумя таблицами с разными именами и с разными именами столбцов. Можно ли создать такую ​​репликацию.

server A                                            server B
----------                                          ----------
Table : Test                                        Table : SUBS
--------------                                      ---------------
columns A,B,C                                       Columns D,E,F,G,H

Я хочу настроить репликацию так, чтобы данные столбца A реплицировались в столбец D, данные столбца B реплицировались в столбец E, данные столбца C копировались в столбец F

1 Ответ

4 голосов
/ 22 мая 2011

Очевидно, ответ таков: «Когда вы определяете статью, вам нужно установить для параметра @vertical_partition значение true, а затем добавить нужные столбцы с помощью sp_articlecolumn."

Однако я должен спросить, почему ты это делаешь. Репликация, на мой взгляд, не является общим инструментом для перемещения данных между разными базами данных, но для синхронизации двух идентичных баз данных.

Другие идеи мозгового штурма:

  • Вы можете создать новую исходную таблицу, которая соответствует целевой таблице, и использовать триггер для синхронизации исходной таблицы.
  • Переместите исходную таблицу без изменений в пункт назначения и выполните MERGE в базе данных назначения.
  • Репликация не может быть правильным решением, здесь. Каковы бизнес-правила и требования, которые требуют этого? Рассматривали ли вы использование SSIS?
  • Если необходимо, чтобы две таблицы постоянно находились в точной синхронизации, тогда каков канал изменений исходной таблицы - приложения? Похоже, что вашему приложению нужен новый уровень абстракции, уровень записи данных, который знает, как писать в два источника одновременно.

Проблема синхронизации данных между двумя различными базами данных может быть проблемой. Могут быть все виды тонких проблем с условиями гонки, отсутствием распределенных транзакций (влияющих на согласованность и реакцию на сбои), проблемами с обходными путями, созданными для решения проблемы отсутствия распределенных транзакций, и так далее, и так далее. Можно ли вместо этого создать связанный сервер и некоторые представления, которые фактически обеспечивают доступ к данным в одной базе данных в реальном времени из другой?

Пожалуйста, расскажите нам больше о ваших требованиях и о том, почему вам нужно это сделать.

Update

Если вы собираетесь указать маршрут обновления вручную, вы не можете применять операции вставки, обновления и удаления периода времени в массовом порядке. Вы должны применять их по одному, в порядке . Если вместо этого вы работаете с текущим состоянием , а не с промежуточными операциями с данными, то вы можете выполнять все строки одновременно. Я покажу вам пример MERGE, а не историю воспроизведения.

BEGIN TRAN;

DELETE D
FROM LinkedServer.dbo.Dest D WITH (TABLOCKX, HOLDLOCK)
WHERE
   NOT EXISTS (
      SELECT *
      FROM Source S
      WHERE D.Key = S.Key
   );

UPDATE D
SET
   D.Col1 = S.Col4,
   D.Col2 = S.Col5,
   D.Col3 = S.Col6,
   D.Col4 = S.Col7,
FROM
   LinkedServer.dbo.Dest D
   INNER JOIN Source S ON D.Key = S.Key
WHERE
   D.Col1 <> S.Col4
   OR EXISTS (
      SELECT D.Col2, D.Col4
      EXCEPT
      SELECT S.Col3, S.Col6
   ); -- or some other way to handle comparison of nullable columns

INSERT LinkedServer.dbo.Dest (Col1, Col2, Col3)
SELECT Col4, Col5, Col6
FROM Source S WITH (TABLOCK, HOLDLOCK)
WHERE
   NOT EXISTS (
      SELECT *
      FROM LinkedServer.dbo.Dest D
      WHERE S.Key = D.Key
   );

COMMIT TRAN;

Может оказаться, что лучше перенести всю таблицу и выполнить операцию слияния на конечном сервере.

Подсказки на блокировку, которые я вставил в первый запрос, важны, если вы хотите получить согласованный моментальный снимок на определенный момент времени. Если вас это не волнует, уберите подсказки о блокировке.

Если вы обнаружите, что обновления на связанном сервере выполняются медленно, поместите всю таблицу в один фрагмент во временную промежуточную таблицу на удаленном сервере и выполните MERGE в сценарии полностью на удаленном сервере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...