Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Dieser Artikel hilft Ihnen, das Problem zu beheben, das bei der Verwendung der Transaktionsreplikation mit einem Oracle Publisher und Spaltenfiltern auftritt.
Ursprüngliche Produktversion: SQL Server
Ursprüngliche KB-Nummer: 2310152
Problembeschreibung
Wenn Sie die Transaktionsreplikation mit einer Oracle Publisher- und Spaltenfilterung verwenden, stellen Sie fest, dass der vom Publikations-Assistenten generierte Auslöser (Trigger auf Zeilenebene) alle Spalten der Tabelle nachverfolgt, obwohl nur wenige veröffentlicht werden.
Ursache
Wenn ein vertikaler Filter auf eine Publikation angewendet wird, die mithilfe eines Oracle-Herausgebers erstellt wird, der mit der Gatewayoption konfiguriert ist, schränkt SQL Server die Nachverfolgungstabelle so ein, dass nur die interessanten Spalten eingeschlossen werden, aber die auslösenden Ereignisse nicht eingeschränkt werden. Wenn es daher viele Aktualisierungen an Tabellenspalten gibt, die nicht in der Nachverfolgungstabelle enthalten sind, werden viele unnötige Zeilen in der Nachverfolgungstabelle protokolliert.
Problemumgehung
Sie können das Problem umgehen, indem Sie den Datenbankauslöser, der während der Replikationseinrichtung in der Oracle-Datenbank generiert wird, manuell ändern, um eine explizite Spaltenliste einzuschließen, um die Spalten einzuschränken, die bei der Aktualisierung ausgeführt werden, wodurch der Auslöser ausgelöst wird.
Verwenden Sie das folgende Verfahren, um die Problemumgehung zu implementieren:
- Überprüfen, ob der Oracle-Herausgeber als Gatewayherausgeber konfiguriert ist
- Markieren Sie entweder die veröffentlichte Tabelle oder den zugehörigen Tabellenbereich als schreibgeschützt.
- Bestimmen Sie den Namen des Zeilenauslösers und der Protokolltabelle, die der veröffentlichten Tabelle zugeordnet ist.
- Ändern Sie die Klausel des Zeilenauslösers, der die Schießbedingungen angibt, um eine explizite Spaltenliste einzuschließen, die nur die veröffentlichten Spalten enthält.
- Stellen Sie die veröffentlichte Tabelle oder den zugehörigen Tabellenbereich zum Lesen des Schreibvorgangs wieder her.
Weitere Informationen zu den einzelnen Schritten finden Sie in den folgenden Absätzen:
So markieren Sie entweder die veröffentlichte Tabelle oder den zugehörigen Tabellenbereich als schreibgeschützt:
Bevor Sie den Trigger ändern, sollten Sie die Tabelle auf schreibgeschützt festlegen, sodass keine Änderungen verloren gehen. Wenn Ihre Oracle-Version vor 11 g liegt, müssen Sie den Tabellenbereich, der der Tabelle zugeordnet ist, als schreibgeschützt markieren. Schreibgeschütztes Erstellen eines Tabellenbereichs verhindert Schreibvorgänge für die Datendateien im Tabellenbereich. Führen Sie die folgende Abfrage aus, um zu ermitteln, welcher Tabellenbereich ihrer veröffentlichten Tabelle zugeordnet ist:
select table_name, tablespace_name from all_tables
where table_name = 'my_table' and owner = 'my_name';
Verwenden Sie einen Befehl wie den folgenden, um eine Datendatei schreibgeschützt zu machen:
ALTER TABLESPACE my_tablespace READ ONLY;
In Oracle 11 g können Sie eine Tabelle direkt als schreibgeschützt markieren.
ALTER TABLE my_table READ ONLY;
So markieren Sie entweder die veröffentlichte Tabelle oder den zugehörigen Tabellenbereich als schreibgeschützt:
Bevor Sie den Trigger ändern, sollten Sie die Tabelle auf schreibgeschützt festlegen, sodass keine Änderungen verloren gehen. Wenn Ihre Oracle-Version vor 11 g liegt, müssen Sie den Tabellenbereich, der der Tabelle zugeordnet ist, als schreibgeschützt markieren. Schreibgeschütztes Erstellen eines Tabellenbereichs verhindert Schreibvorgänge für die Datendateien im Tabellenbereich. Führen Sie die folgende Abfrage aus, um zu ermitteln, welcher Tabellenbereich ihrer veröffentlichten Tabelle zugeordnet ist:
select table_name, tablespace_name from all_tables
where table_name = 'my_table' and owner = 'my_name';
Verwenden Sie einen Befehl wie den folgenden, um eine Datendatei schreibgeschützt zu machen:
ALTER TABLESPACE my_tablespace READ ONLY;
In Oracle 11 g können Sie eine Tabelle direkt als schreibgeschützt markieren.
ALTER TABLE my_table READ ONLY;
So ermitteln Sie den Namen des Zeilentriggers und der Protokolltabelle, die der veröffentlichten Tabelle zugeordnet ist:
Alle Protokolltabellen und Trigger haben Namen aus den folgenden Vorlagen:
HREPL_ARTICLE N LOG_ V
HREPL_ARTICLE N_TRIGGER_ROW
wenn N und V auf folgende Weise bestimmt werden:
N ist die article_id, die der veröffentlichten Tabelle zugeordnet ist, die mithilfe der folgenden SQL-Abfrage am Verteiler abgerufen werden kann:
select name, table_id from distribution.dbo.IHarticles
V ist ein Versionsdesignator. Wenn zwei Protokolltabellen denselben zugeordneten Wert für N aufweisen, weist das aktive Protokoll den größeren V-Wert auf.
So ändern Sie die Klausel des Zeilentriggers, der die Auslösebedingungen angibt, um eine explizite Spaltenliste einzuschließen, die nur die veröffentlichten Spalten enthält:
Oracle bietet ein kostenloses GUI-Tool namens SQL Developer, das gut geeignet ist, um die erforderlichen Änderungen am generierten Trigger vorzunehmen. Sie können die folgenden Schritte im SQL-Entwicklertool ausführen, um die erforderlichen Änderungen vorzunehmen:
Öffnen Sie eine Verbindung mit Ihrer Oracle-Instanz.
Erweitern Sie unter den definierten Oracle-Schemas das Schema, das Ihrem Replikationsadministratorbenutzer entspricht.
Suchen Sie Trigger in der Liste der Objekte, und erweitern Sie diese, um die Liste der Trigger anzuzeigen, die dem Replikationsadministratorbenutzer gehören.
Suchen Sie den Trigger, der geändert werden soll, und markieren Sie ihn. Der Text für den Trigger wird im rechten Bereich angezeigt.
Klicken Sie mit der rechten Maustaste auf den Triggernamen in der Liste, und wählen Sie "Bearbeiten" aus.
Die Änderung an der Triggerdefinition wird am Anfang des Triggers vorgenommen, was ähnlich wie folgt aussieht:
.. CREATE OR REPLACE TRIGGER AFTER DELETE OR INSERT OR UPDATE OF
my_name.my_table
FÜR JEDE ZEILE...
Um den Auslöser zu ändern, schließen Sie nach dem UPDATE-Schlüsselwort die Liste der Spalten aus der veröffentlichten Tabelle ein, die im Artikel enthalten waren. Wenn Sie Tabellen unter dem Repl-Administratorschema erweitern und dann die Artikelprotokolltabelle erweitern, die der veröffentlichten Tabelle zugeordnet ist, werden die spalten, die in das Protokoll eingefügt werden, nach den fünf anfänglichen Metadatenspalten, die mit HREPL_ vorgestellt sind, im Protokoll angezeigt. Das Wort "EIN" sollte am Anfang der Liste der Spalten angezeigt werden. Die änderungen, die für die Tabelle my_name.my_table mit veröffentlichten Spalten PK, c1 und c2 erforderlich sind, werden unten angezeigt.
create or replace TRIGGER AFTER DELETE OR INSERT OR UPDATE ON "PK", "c1", "c2" OF my_name.my_table FOR EACH ROW...
Wenn Sie die Änderung abgeschlossen haben, klicken Sie mit der rechten Maustaste auf den Triggernamen, und wählen Sie "Kompilieren" aus, um den überarbeiteten Trigger zu kompilieren. Stellen Sie sicher, dass der resultierende Auslöser nach der Kompilierung als gültig identifiziert wird.
Wiederherstellen der veröffentlichten Tabelle oder des zugehörigen Tabellenbereichs zum Lesen des Schreibvorgangs:
Stellen Sie nach Abschluss der Änderung des Triggers sicher, dass Sie den Tabellenbereich oder die Tabelle in READ WRITE wiederherstellen, je nachdem, welches schreibgeschützt markiert wurde. Die folgende Anweisung macht den my_tablespace Tabellenbereich schreibbar:
ALTER TABLESPACE *my_tablespace* READ WRITE;
Verwenden Sie in Oracle 11 g den Befehl "Alter Table", um die Tabelle wiederherzustellen, um Änderungen zuzulassen:
ALTER TABLE *my_table* READ WRITE;
Verwenden Sie die folgende Abfrage in Oracle 11 g, um zu überprüfen, ob die veröffentlichte Tabelle nicht mehr schreibgeschützt ist:
select table_name, read_only
from dba_tables
where table_name = 'my_table' and owner = 'my_owner'
Haftungsausschluss von Drittanbietern
Informationen zum Haftungsausschluss von Drittanbietern
Die in diesem Artikel genannten Drittanbieterprodukte stammen von Herstellern, die von Microsoft unabhängig sind. Microsoft gewährt keine implizite oder sonstige Garantie in Bezug auf die Leistung oder Zuverlässigkeit dieser Produkte.