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.