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

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

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

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


person Raymond Morphy    schedule 18.04.2011    source источник
comment
возможный дубликат Как реплицировать две таблицы с разными структурами, но с теми же полями?   -  person Ed Harper    schedule 18.04.2011
comment
Однако какое решение?   -  person Raymond Morphy    schedule 18.04.2011


Ответы (1)


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

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

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

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

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

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

Обновить

Если вы идете по маршруту ручного обновления, обратите внимание, что вы не можете применять операции вставки, обновления и удаления периода времени в массовом порядке. Вы должны применять их по одному, по порядку. Если вместо этого вы работаете с текущим состоянием, а не с промежуточными операциями с данными, вы можете выполнять все строки одновременно. Я покажу вам пример 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 в сценарии на удаленном сервере.

person ErikE    schedule 22.05.2011
comment
Я просто хотел обновить две базы данных в двух разных местах. как вы сказали, я создал временную таблицу и вставил все обновленные или вставленные записи в временную таблицу с помощью триггеров. а затем использовали хранимые процедуры и запланированные задания и связанный сервер для вставки или обновления эквивалентных записей в удаленной базе данных. Но моя проблема связана с распределенной транзакцией. Будут ли мои проблемы во время потери соединения удовлетворять с помощью распределенных транзакций? Предположим, во время обновления удаленной базы данных соединение потеряно. Достаточно ли использовать распределенную транзакцию? - person Raymond Morphy; 22.05.2011
comment
Вам нужно искать распределенные транзакции. Начните транзакцию, выполните обновление через связанный сервер, удалите локальную строку, затем зафиксируйте. Если это сработает, ты золотой. Если он жалуется на распределенные транзакции, вам есть над чем поработать. - person ErikE; 22.05.2011
comment
Я искал о распределенной транзакции, но я не знаю, следует ли мне использовать оператор Rollback или достаточно использовать commit для распределенной транзакции? Не могли бы вы привести пример? - person Raymond Morphy; 22.05.2011
comment
Спасибо @Erik за ответ. Я написал задание с тремя шагами и запланированное задание повторять каждые 5 минут. первый шаг для вставки, второй для обновления и третий для удаления. Я делаю правильно? Когда первые шаги завершатся, запустится второй, если первый шаг завершится успешно, запустится второй и то же самое для третьего шага. - person Raymond Morphy; 23.05.2011
comment
@Raymond, нет, тебе нужно поместить три оператора в одну транзакцию. Нет смысла делать их отдельно, потому что тогда ваша удаленная таблица не будет представлять момент времени. Хотя это может быть не очень серьезно, нет причин не помещать все обновления в один сценарий. Кроме того, если у вас сработало что-то вроде моего вышеприведенного запроса, то вы знаете, что распределенные транзакции работают, и служба DTC работает на обоих серверах с разрешениями, установленными для их правильного разрешения. - person ErikE; 23.05.2011