sql >> Databáze >  >> RDS >> Sqlserver

replikace mezi dvěma tabulkami s různými názvy, které mají různé názvy sloupců. Je možné vytvořit takovou replikaci

Odpověď zřejmě zní:„Když definujete článek, budete muset nastavit @vertical_partition parametr na hodnotu true a poté přidejte požadované sloupce pomocí sp_articlecolumn ."

Musím se však zeptat, proč to děláte. Replikace v mé mysli není obecný nástroj pro přesun dat mezi na rozdíl od databází, ale pro udržování synchronizace dvou identických databází.

Další nápady na brainstorming:

  • Můžete vytvořit novou zdrojovou tabulku, která bude odpovídat cílové tabulce, a použít spouštěč, aby byla zdrojová tabulka synchronizovaná.
  • Přesuňte zdrojovou tabulku neporušenou do cíle a proveďte SLOUČENÍ v cílové databázi.
  • Replikace nemusí být ve skutečnosti tím správným řešením. Jaká jsou obchodní pravidla a požadavky, které k tomu vyžadují? Uvažovali jste o použití SSIS?
  • Pokud je potřeba, aby byly tyto dvě tabulky neustále v přesné synchronizaci, jaký je kanál změn ve zdrojové tabulce – aplikaci? Skoro to zní, jako by vaše aplikace potřebovala novou úroveň abstrakce, vrstvu pro zápis dat, která ví, jak zapisovat do dvou zdrojů současně.

Snaha o synchronizaci dat mezi dvěma různými databázemi může být problém. Mohou se vyskytnout nejrůznější jemné problémy s podmínkami závodu, nedostatkem distribuovaných transakcí (ovlivňující konzistenci a reakci na selhání), problémy s řešeními vytvořenými pro řešení neexistence distribuovaných transakcí a tak dále a tak dále. Můžete místo toho vytvořit propojený server a některé pohledy, které ve skutečnosti umožňují přístup k datům v jedné databázi v reálném čase z druhé?

Sdělte nám prosím více o svých požadavcích a o tom, proč to musíte udělat.

Aktualizovat

Pokud se vydáte cestou ruční aktualizace, všimněte si, že nemůžete hromadně použít operace vkládání, aktualizace a mazání časového období. Musíte je použít jeden po druhém, v pořadí . Pokud místo toho pracujete s aktuálním stavem spíše než přechodné datové operace, pak můžete provádět všechny řádky najednou. Ukážu vám příklad MERGE, ne přehrávání historie.

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;

Možná bude lepší poslat celou tabulku a provést operaci sloučení na cílovém serveru.

Tipy na zamykání, které jsem vložil do prvního dotazu, jsou důležité, pokud chcete mít konzistentní snímek k určitému okamžiku. Pokud se o to nestaráte, odstraňte tipy pro zamykání.

Pokud zjistíte, že aktualizace na propojeném serveru jsou pomalé, přesuňte celou tabulku v jednom kuse do dočasné pracovní tabulky na vzdáleném serveru a proveďte SLOUČENÍ ve skriptu zcela na vzdáleném serveru.




  1. Existuje způsob, jak převést více formátů data na datetime python

  2. Dynamické vytváření DAG na základě řádku dostupného na DB Connection

  3. Jak zabiju všechny procesy v seznamu procesů zobrazení Mysql?

  4. iterování řádků datové mřížky