Oracle-Triggern sendet Daten für Spalten nicht veröffentlichten Microsoft SQL Server-Replikation

Gilt für: SQL Server 2008 DeveloperSQL Server 2008 EnterpriseSQL Server 2008 R2 Datacenter

Problembeschreibung


Bei Verwendung von Transaktionsreplikation mit Oracle-Verleger Spaltenfilter bemerken Sie, dass vom Assistenten Publikation (Zeile auf Trigger) generierten Trigger verwalten alle Spalten der Tabelle der ist zwar nur veröffentlicht werden.

Ursache


Ein vertikaler Filter einer Publikation angewendet wird, die mithilfe eines Oracle-Verlegers mit Gateway konfiguriert SQL Server beschränkt, um nur die Spalten die Tabelle als schränkt nicht ausgelöst. Wenn gibt es viele Updates für Spalten, die nicht in der Tabelle enthalten sind, werden daher viele unnötige Zeilen in der Tabelle protokolliert.


PROBLEMUMGEHUNG


Sie können umgehen das Problem manuell ändern Datenbank-Trigger, der auf der Oracle-Datenbank generiert wird, während der Replikation Installation enthalten eine explizite Spaltenliste die Spalten beschränkt, die in Update führt den Trigger ausgelöst.

Gehen Sie folgendermaßen vor, um die Abhilfemaßnahme:
  1. Oracle-Verleger als Gatewayverleger konfiguriert ist
  2. Markieren Sie die publizierte Tabelle oder die zugeordnete Tablespace als schreibgeschützt
  3. Bestimmen Sie den Namen der Zeile Trigger und Protokolldateien Tabelle publizierte Tabelle zugeordnet.
  4. Ändern Sie die Klausel zeilentrigger, der Bedingung auslösen sollen eine explizite Spaltenliste mit den publizierten Spalten angibt.
  5. Wiederherstellen der publizierten Tabelle oder seiner zugeordneten Tablespace lesen schreiben.

Weitere Informationen zu jedem Schritt finden Sie in den folgenden Abschnitten:

Wie die publizierte Tabelle oder die zugeordnete Tablespace als schreibgeschützt gekennzeichnet:

Bevor Sie den Auslöser ändern, sollten Sie die Tabelle auf schreibgeschützt festgelegt, sodass keine Änderung verloren. Wenn Ihre Version Oracle 11 g ist, müssen Sie Tablespace zugeordnete Tabelle als schreibgeschützt markiert. Einen Tablespace schreibgeschützt machen verhindert Schreibvorgänge auf die Datendateien im Tablespace. Um zu bestimmen, welche Tablespace publizierten Tabelle zugeordnet ist, führen Sie die folgende Abfrage:

select table_name, tablespace_name from all_tables
where table_name = 'my_table' and owner = 'my_name';

Um eine Datendatei Schreibschutz verwenden Sie einen Befehl ähnlich dem folgenden:

ALTER TABLESPACE my_tablespace READ ONLY;
In Oracle 11g können Sie direkt eine Tabelle als schreibgeschützt kennzeichnen.

ALTER TABLE my_table READ ONLY;
Wie die publizierte Tabelle oder die zugeordnete Tablespace als schreibgeschützt markiert:

Bevor Sie den Auslöser ändern, sollten Sie die Tabelle auf schreibgeschützt festgelegt, sodass keine Änderung verloren. Wenn Ihre Version Oracle 11 g ist, müssen Sie Tablespace zugeordnete Tabelle als schreibgeschützt markiert. Einen Tablespace schreibgeschützt machen verhindert Schreibvorgänge auf die Datendateien im Tablespace. Um zu bestimmen, welche Tablespace publizierten Tabelle zugeordnet ist, führen Sie die folgende Abfrage:

select table_name, tablespace_name from all_tables
where table_name = 'my_table' and owner = 'my_name';
Um eine Datendatei Schreibschutz verwenden Sie einen Befehl ähnlich dem folgenden:

ALTER TABLESPACE my_tablespace READ ONLY;
In Oracle 11g können Sie direkt eine Tabelle als schreibgeschützt kennzeichnen.

ALTER TABLE my_table READ ONLY;
  
So bestimmen Sie den Namen der Zeile Trigger und Protokolldateien Tabelle publizierte Tabelle zugeordnet:

Alle Tabellen und Trigger haben Namen aus folgenden Vorlagen erstellt:

HREPL_ARTICLENLOG_V

HREPL_ARTICLEN_TRIGGER_ROW

wobei N und V wie folgt bestimmt werden:

N ist Article_id zugeordnete publizierte Tabelle mithilfe der folgenden SQL-Abfrage auf dem Verteiler abgerufen werden kann:

Wählen Sie Namen, Tabellen aus distribution.dbo.IHarticles

V ist eine Versions-Designator. Haben zwei Tabellen denselben zugeordneten Wert für N, hat das aktive Protokoll den größeren Wert V .


Wie Klausel des Triggers Zeile ändern, die Bedingung auslösen, eine explizite Spaltenliste mit den publizierten Spalten enthalten:

Oracle bietet ein kostenloses GUI Tool zur erforderlichen Änderungen an den generierten Trigger SQL-Entwickler. Die folgenden Schritte können in SQL Entwicklertool erforderlichen Modifikationen:

  1. Herstellen einer Verbindung zu Ihrer Oracle-Instanz.
  2. Erweitern Sie unter definierten Oracle-Schemas für den Administratorbenutzer Replikation Schema.
  3. Suchen Sie Trigger in die Liste der Objekte und erweitern Sie, um die Liste der Benutzer Administrator Replikation Trigger.
  4. Suchen Sie den Trigger geändert werden und es. Der Text für den Trigger wird im rechten Fensterbereich angezeigt.
  5. Klicken Sie mit der rechten Maustaste in der Liste auf den Trigger und wählen Sie Bearbeiten
  6. Die Änderung der Triggerdefinition erfolgt sehr nahe dem Anfang des Triggers, die etwa wie folgt aussehen:
    ..create or replace TRIGGER AFTER DELETE OR INSERT OR UPDATE OF 
    my_name.my_table
     FOR EACH ROW…
  7. Ändern Sie den Trigger enthalten Sie nach dem UPDATE-Schlüsselwort die Liste der Spalten aus den publizierten Tabelle in den Artikel aufgenommen wurden. Wenn Sie blenden Tabellen unter Repl Administrator Schema erweitern die publizierte Tabelle zugeordnete Artikel Protokolltabelle und die Spalten sind im Protokoll nach 5 erste Spalten mit Metadaten, die mit HREPL_ beginnen. Auf sollte am Anfang der Liste der Spalten angezeigt. Für Tabelle my_name.my_table publizierten Spalten PK, c1 und c2 erforderlichen Modifikationen sind unten aufgeführt.
    create or replace TRIGGER AFTER DELETE OR INSERT OR UPDATE ON "PK", "c1", "c2" OF my_name.my_table FOR EACH ROW…
  8. Wenn Sie die Änderung abgeschlossen haben, klicken Sie auf Triggername und wählen Kompilierung zum Kompilieren des geänderten Triggers. Stellen Sie sicher, dass der resultierende Trigger identifiziert als gültigen nach der Kompilierung.
Wie die publizierte Tabelle oder der zugehörigen Tablespace Lesen Schreiben wiederherstellen:


Nach Abschluss der Änderung der Trigger, unbedingt LESEN SCHREIBEN Tablespace oder Tabelle wiederherstellen je nach SCHREIBGESCHÜTZT markiert wurde. Die folgende Anweisung macht: My_tablespace Tablespace beschreibbare

ALTER TABLESPACE my_tablespace READ WRITE;
Oracle 11 g Befehl Alter Table um Modifikationen wiederherstellen:

ALTER TABLE my_table READ WRITE;
Verwenden Sie die folgende Abfrage in Oracle 11 g um zu überprüfen, ob die publizierte Tabelle nicht mehr schreibgeschützt ist:

select table_name, read_only
from dba_tables

where table_name = ‘my_table’ and owner = ‘my_owner’


Status


Microsoft hat bestätigt, dass es ein Problem bei den Microsoft-Produkten handelt, die im Abschnitt "Gilt für" aufgeführt sind

Weitere Informationen


Die in diesem Artikel erörterten Produkte von Drittanbietern werden von Unternehmen hergestellt, die von Microsoft unabhängig sind. Microsoft übernimmt keine Garantie, weder konkludent noch anderweitig, für die Leistung oder Zuverlässigkeit dieser Produkte.