Oracle-publicatietriggers verzenden gegevens voor niet-gepubliceerde kolommen bij het repliceren met Microsoft SQL Server
Artikel
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:
Controleer of de Oracle-uitgever is geconfigureerd als gateway-uitgever
Markeer de gepubliceerde tabel of de bijbehorende tabelruimte als alleen-lezen.
Bepaal de naam van de rijtrigger en logboektabel die aan de gepubliceerde tabel is gekoppeld.
Wijzig de component van de rijtrigger die de voorwaarden identificeert om een expliciete kolomlijst op te nemen die alleen de gepubliceerde kolommen bevat.
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
ALTERTABLESPACE my_tablespace READONLY;
In Oracle 11 g kunt u een tabel als alleen-lezen rechtstreeks markeren.
SQL
ALTERTABLE my_table READONLY;
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
ALTERTABLESPACE my_tablespace READONLY;
In Oracle 11 g kunt u een tabel als alleen-lezen rechtstreeks markeren.
SQL
ALTERTABLE my_table READONLY;
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
selectname, 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:
Open een verbinding met uw Oracle-exemplaar.
Vouw onder de gedefinieerde Oracle-schema's het schema uit dat overeenkomt met de gebruiker van uw replicatiebeheerder.
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.
Zoek de trigger die moet worden gewijzigd en markeer deze. De tekst voor de trigger wordt weergegeven in het rechterdeelvenster.
Klik met de rechtermuisknop op de triggernaam in de lijst en selecteer Bewerken
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...
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.
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
ALTERTABLESPACE *my_tablespace* READ WRITE;
Gebruik in Oracle 11 g de opdracht alter table om de tabel te herstellen om wijzigingen toe te staan:
SQL
ALTERTABLE *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.
Azure SQL-module voor het bijhouden van gegevens die betrekking hebben op het bijhouden van gegevenswijzigingen. De module verkent hulpprogramma's zoals cdc (Change Data Capture) en wijzigingen bijhouden.