Lezen in het Engels

Delen via


Oracle-publicatietriggers verzenden gegevens voor niet-gepubliceerde kolommen bij het repliceren met Microsoft SQL Server

Dit artikel helpt u bij het oplossen van het probleem dat optreedt bij het gebruik van transactionele replicatie met een Oracle Publisher- en kolomfiltering.

Oorspronkelijke productversie: SQL Server
Oorspronkelijk KB-nummer: 2310152

Symptomen

Wanneer u transactionele replicatie gebruikt met een Oracle Publisher- en kolomfiltering, ziet u dat de trigger die is gegenereerd door de publicatiewizard (trigger op rijniveau) alle kolommen van de tabel bijhoudt, ook al zijn er slechts enkele gepubliceerd.

Oorzaak

Wanneer een verticaal filter wordt toegepast op een publicatie die is gemaakt met behulp van een Oracle-uitgever die is geconfigureerd met de gatewayoptie, beperkt SQL Server de traceringstabel tot alleen de interessekolommen, maar worden de triggergebeurtenissen niet beperkt. Als er veel updates zijn voor tabelkolommen die niet zijn opgenomen in de volgtabel, worden veel overbodige rijen vastgelegd in de trackingtabel.

Tijdelijke oplossing

U kunt het probleem omzeilen door de databasetrigger die tijdens het instellen van de replicatie wordt gegenereerd, handmatig te wijzigen om een expliciete kolomlijst op te nemen om de kolommen te beperken die bij de update ervoor zorgen dat de trigger wordt geactiveerd.

Gebruik de volgende procedure om de tijdelijke oplossing te implementeren:

  1. Controleer of de Oracle-uitgever is geconfigureerd als gateway-uitgever
  2. Markeer de gepubliceerde tabel of de bijbehorende tabelruimte als alleen-lezen.
  3. Bepaal de naam van de rijtrigger en logboektabel die aan de gepubliceerde tabel is gekoppeld.
  4. Wijzig de component van de rijtrigger die de voorwaarden identificeert om een expliciete kolomlijst op te nemen die alleen de gepubliceerde kolommen bevat.
  5. Herstel de gepubliceerde tabel of de bijbehorende tabelruimte om schrijfbewerkingen te lezen.

Zie de volgende alinea's voor meer informatie over elke stap:

De gepubliceerde tabel of de bijbehorende tabelruimte markeren als alleen-lezen:

Voordat u de trigger wijzigt, moet u de tabel instellen op alleen-lezen, zodat er geen wijzigingen verloren gaan. Als uw Oracle-versie vóór 11 g is, moet u de tabelruimte markeren die aan de tabel is gekoppeld als alleen-lezen. Als u een tabelruimte alleen-lezen maakt, voorkomt u schrijfbewerkingen in de gegevensbestanden in de tabelruimte. Voer de volgende query uit om te bepalen welke tabelruimte is gekoppeld aan uw gepubliceerde tabel:

SQL
select table_name, tablespace_name from all_tables

where table_name = 'my_table' and owner = 'my_name';

Als u een gegevensbestand alleen-lezen wilt maken, gebruikt u een opdracht die vergelijkbaar is met de volgende:

SQL
ALTER TABLESPACE my_tablespace READ ONLY;

In Oracle 11 g kunt u een tabel als alleen-lezen rechtstreeks markeren.

SQL
ALTER TABLE my_table READ ONLY;

De gepubliceerde tabel of de bijbehorende tabelruimte markeren als alleen-lezen:

Voordat u de trigger wijzigt, moet u de tabel instellen op alleen-lezen, zodat er geen wijzigingen verloren gaan. Als uw Oracle-versie vóór 11 g is, moet u de tabelruimte markeren die aan de tabel is gekoppeld als alleen-lezen. Als u een tabelruimte alleen-lezen maakt, voorkomt u schrijfbewerkingen in de gegevensbestanden in de tabelruimte. Voer de volgende query uit om te bepalen welke tabelruimte is gekoppeld aan uw gepubliceerde tabel:

SQL
select table_name, tablespace_name from all_tables

where table_name = 'my_table' and owner = 'my_name';

Als u een gegevensbestand alleen-lezen wilt maken, gebruikt u een opdracht die vergelijkbaar is met de volgende:

SQL
ALTER TABLESPACE my_tablespace READ ONLY;

In Oracle 11 g kunt u een tabel als alleen-lezen rechtstreeks markeren.

SQL
ALTER TABLE my_table READ ONLY;

De naam bepalen van de rijtrigger en logboektabel die aan de gepubliceerde tabel zijn gekoppeld:

Alle logboektabellen en triggers hebben namen die zijn samengesteld uit de volgende sjablonen:

  • HREPL_ARTICLE N LOG_ V

  • HREPL_ARTICLE N_TRIGGER_ROW

waarbij N en V op de volgende manier worden bepaald:

N is de article_id gekoppeld aan de gepubliceerde tabel, die kan worden verkregen met behulp van de volgende SQL-query bij de distributeur:

SQL
select name, table_id from distribution.dbo.IHarticles

V is een versieontwerpaar. Als twee logboektabellen dezelfde gekoppelde waarde voor N hebben, heeft het actieve logboek de grotere V-waarde.

Het wijzigen van de component van de rijtrigger die de voorwaarden identificeert om een expliciete kolomlijst op te nemen die alleen de gepubliceerde kolommen bevat:

Oracle biedt een gratis GUI-hulpprogramma met de naam SQL Developer dat geschikt is voor het aanbrengen van de benodigde wijzigingen aan de gegenereerde trigger. U kunt de volgende stappen in het SQL Developer-hulpprogramma gebruiken om de benodigde wijzigingen aan te brengen:

  1. Open een verbinding met uw Oracle-exemplaar.

  2. Vouw onder de gedefinieerde Oracle-schema's het schema uit dat overeenkomt met de gebruiker van uw replicatiebeheerder.

  3. Zoek triggers in de lijst met objecten en vouw deze uit om de lijst met triggers te zien die eigendom zijn van de gebruiker van de replicatiebeheerder.

  4. Zoek de trigger die moet worden gewijzigd en markeer deze. De tekst voor de trigger wordt weergegeven in het rechterdeelvenster.

  5. Klik met de rechtermuisknop op de triggernaam in de lijst en selecteer Bewerken

  6. De wijziging in de triggerdefinitie wordt aan het begin van de trigger aangebracht, wat er ongeveer als volgt uitziet:

    • .. TRIGGER maken of vervangen NA VERWIJDEREN OF INVOEGEN OF BIJWERKEN VAN

    • my_name.my_table

    • VOOR ELKE RIJ...

  7. Als u de trigger wilt wijzigen, moet u na het trefwoord UPDATE de lijst met kolommen uit de gepubliceerde tabel opnemen die zijn opgenomen in het artikel. Als u tabellen uitvouwt onder het repl-beheerdersschema en vervolgens de tabel met het artikellogboek uitvouwt die is gekoppeld aan de gepubliceerde tabel, worden de kolommen die moeten worden opgenomen in het logboek weergegeven na de vijf eerste metagegevenskolommen die voorafgegaan zijn door HREPL_. Het woord AAN moet worden weergegeven aan het begin van de lijst met kolommen. De wijzigingen die nodig zijn voor tabel my_name.my_table met gepubliceerde kolommen PK, c1 en c2 worden hieronder weergegeven.

    SQL
    create or replace TRIGGER AFTER DELETE OR INSERT OR UPDATE ON "PK", "c1", "c2" OF my_name.my_table FOR EACH ROW...
    
  8. Wanneer u de wijziging hebt voltooid, klikt u met de rechtermuisknop op de naam van de trigger en selecteert u compileren om de herziene trigger te compileren. Zorg ervoor dat de resulterende trigger wordt geïdentificeerd als geldig na de compilatie.

De gepubliceerde tabel of de bijbehorende tabelruimte herstellen om schrijven te lezen:

Nadat u de wijziging van de trigger hebt voltooid, moet u ervoor zorgen dat u de tabelruimte of tabel herstelt naar READ WRITE, afhankelijk van wat als ALLEEN-LEZEN is gemarkeerd. Met de volgende instructie wordt de my_tablespace tablespace beschrijfbaar:

SQL
ALTER TABLESPACE *my_tablespace* READ WRITE;

Gebruik in Oracle 11 g de opdracht alter table om de tabel te herstellen om wijzigingen toe te staan:

SQL
ALTER TABLE *my_table*  READ WRITE;

Gebruik de volgende query in Oracle 11 g om te controleren of de gepubliceerde tabel niet langer alleen-lezen is:

SQL
select table_name, read_only

from dba_tables

where table_name = 'my_table' and owner = 'my_owner'

Disclaimer van derden

Disclaimerinformatie van derden

De producten van derden die in dit artikel worden vermeld, worden vervaardigd door bedrijven die onafhankelijk zijn van Microsoft. Microsoft verleent dan ook geen enkele garantie, impliciet noch anderszins, omtrent de prestaties of de betrouwbaarheid van deze producten.