Kann SQL Server-Replikation umfasst die Quelle Dbid in den replizierten Daten?
-
05-07-2019 - |
Frage
Lassen Sie uns sagen, ich habe DatabaseA mit TableA, die diese Felder hat. ID, Name
In einer anderen Datenbank, DatabaseB, ich habe TableA, die diese Felder hat. DatabaseID, ID, Name
Ist es möglich, die Einrichtung eine Replikationspublikation, die senden:
DatabaseA.dbid, DatabaseA.TableA.Id, DatabaseA.TableA.Name
zu DatabaseB.TableA?
Edit: Der Grund, warum ich frage ist, dass ich mehrere Datenbanken kombinieren muß (mit identischem Schema) in eine einzige Datenbank, mit möglichst geringer Latenzzeit möglich. Replikation schien wie ein guter Anfang (müssen Daten von einem Ort zum anderen replizieren), aber ich bin nur in der Brainstorming-Phase. Ich würde auf jeden Fall offen für Vorschläge, wie dies zu erreichen, ohne die Replikation verwendet wird.
Lösung
Es könnte ein einfacherer Weg, es zu tun, aber das erste, was ich gedacht ist TableA in einer indizierten Sicht auf der Quelldatenbank Einwickeln und dann die Ansicht als Tabelle replizieren (dh type = „indizierte Sicht logbased“) . Ich glaube nicht, dies mit Mergereplikation funktionieren würde, aber.
So, das wäre in etwa wie:
CREATE VIEW TableA_with_dbid WITH SCHEMABINDING AS
SELECT DatabaseA.dbid, Id, Name FROM TableA
CREATE UNIQUE CLUSTERED INDEX ON TableA_with_dbid (Id) -- or whatever your PK is
EXEC sp_addarticle ...,
@source_object = 'TableA_with_dbid',
@destination_table = 'TableA',
@type = 'indexed view logbased',
...
Big Einschränkung: indizierte Sichten haben viele Anforderungen dass kann nicht für Ihre Anwendung geeignet sein. Zum Beispiel haben bestimmte Optionen jedes Mal, wenn Sie die Basistabelle aktualisieren eingestellt werden.
(Als Reaktion auf die Bearbeitung in Frage ...) Dies wird für die Kombination von mehreren Quellen in eine Tabelle nicht. AFAIK, ein Objekt in einer Abonnementdatenbank kann nur aus einem veröffentlichten Artikel. Und Sie können eine indizierte Sicht auf der Abonnementseite nicht tun, da UNION nicht in einer indizierten Sicht zulässig ist. (Die docs nicht explizit UNION ALL-Zustand ist nicht zulässig, aber es würde mich nicht überraschen, Sie könnten versuchen, es für alle Fälle..) Aber es ist immer noch Ihre persönliche Vertrauen Frage beantworten:. Die Dbid in der replizierten Tabelle würden
Andere Tipps
Aggregieren Sie diese Ereignisse an einem Ort aus mehreren Quellen? Replizieren nur aus einer Hand kommt -. Es ist eine Eins-zu-eins, so die Quellen-ID scheint nicht, wie wäre es viel Sinn machen
Wenn Sie Daten aus mehreren Quellen, möglicherweise verknüpfte Server aggregiert und löst eine bessere Wahl ist, und wenn das der Fall ist, dann sind Sie konnte absolut keine Informationen über die Quelle, die Sie wollen.
Wenn Sie Ihre Frage klären können, den Zweck zu beschreiben, würde es uns helfen, die beste Lösung zu finden.
FROM NEW DETAIL IN FRAGE AKTUALISIERT:
Enthält diese Lösung klingt wie es sein könnte, was Sie brauchen?
- Richten Sie AFTER-Trigger auf den Source-Datenbanken, die alle geänderten Zeilen an das zentrale Repository-Datenbank senden, in irgendeiner Art von Tisch zu halten. Diese Zeilen können zusätzliche Spalten enthalten, wie „Source“, „Typ ändern“ (für Einfügen, Löschen, usw.).
- Einige zentrale Prozess überwacht den Tisch und verarbeitet neue Zeilen (oder läuft in regelmäßigen Abständen - einmal / Minute, vielleicht), so dass sie in die zentrale Datenbank enthält
Sie könnten einstellen, wie häufig die Überprüfung / Merge-Prozess auf dem Server ausgeführt wird, basierend auf Ihre Bedürfnisse (auch nicht ständig laufen neue Zeilen zu handhaben, wie sie erscheinen, vielleicht sogar mit einem AFTER-Trigger für die Tabelle als auch).