Die Replikation repliziert auch Ihre Löschungen. Wenn Sie die Löschvorgänge aus Ihrer Archivdatenbank jedoch nicht löschen, kann dies bei eindeutigen Indizes zu Problemen führen, wenn ein Wert in der Produktionsdatenbank gültig, aber in der Archivdatenbank nicht gültig ist, da die Werte dort bereits vorhanden sind. Wenn Ihr Design bedeutet, dass dies kein Problem ist, dann ein einfacher Trigger in der Produktion Tabelle wird dies für Sie tut:
CREATE TRIGGER TR_MyTable_ToArchive ON MyTable FOR INSERT, UPDATE AS
BEGIN
SET ROW_COUNT OFF
-- First inserts
SET IDENTITY_INSERT ArchiveDB..MyTable ON -- Only if identity column is used
INSERT INTO ArchiveDB..MyTable(MyTableKey, Col1, Col2, Col3, ...)
SELECT MyTableKey, Col1, Col2, Col3, ...
FROM inserted i LEFT JOIN deleted d ON i.MyTableKey = d.MyTableKey
WHERE d.MyTableKey IS NULL
SET IDENTITY_INSERT ArchiveDB..MyTable OFF -- Only if identity column is used
-- then updates
UPDATE t SET Col1 = i.col1, col2 = i.col2, col3 = i.col3, ...
FROM ArchiveDB..MyTable t INNER JOIN inserted i ON t.MyTableKey = i.MyTableKey
INNER JOIN deleted d ON i.MyTableKey = d.MyTableKey
END
Dies setzt voraus, dass die Archivdatenbank auf dem gleichen Server wie Ihre Produktion Datenbank befindet. Wenn dies nicht der Fall ist, müssen Sie einen Verbindungsservereintrag erstellen und dann ArchiveDB..MyTable
durch ArchiveServer.ArchiveDB..MyTable
ersetzen, wobei ArchiveServer
der Name des Verbindungsservers ist.
Wenn Ihre Produktionsdatenbank bereits stark ausgelastet ist, sollten Sie jedoch bedenken, dass dadurch die Datenmenge verdoppelt wird. Um dies zu umgehen, können Sie in jeder Ihrer Tabellen ein Update-Flag-Feld hinzufügen und eine geplante Aufgabe zu einem Zeitpunkt ausführen, zu dem die Datenbankbelastung minimal ist, beispielsweise um 1 Uhr morgens. Ihr Auslöser würde dann das Feld auf I
für eine Einfügung oder U
für ein Update in der Produktionsdatenbank setzen, und die geplante Aufgabe würde dann aktualisieren oder in die Archivdatenbank einfügen, abhängig vom Wert dieses Feldes, und dann das Feld zurücksetzen zu NULL
sobald es fertig ist.
Schreiben Sie einen Trigger für Archiv db ON After INSERT in Prod db – Teja
@Vutukuri Was ist, wenn es viele Transaktionen in seiner Datenbank gibt? Wäre es die richtige Lösung? – rvphx