Ik denk dat de betere vraag is:wat is de beste manier om gegevens van SQL Server naar Oracle te verplaatsen, waarmee elke succesvol geleverde rij uit MSSS wordt verwijderd?
Je doet deze in een lus om ervoor te zorgen dat wanneer je iets toevoegt aan het ene, je het verwijdert uit het andere.
Als er een onbekend willekeurig iets gebeurt met een fout op de insert, vermijd je het verwijderen van het bronrecord.
Dat is de essentie, toch?
Er zijn veel betere manieren om met dit soort gegevensverplaatsing om te gaan dan het vastleggen na elke gedistribueerde transactielus voor invoegen/verwijderen.
Ten eerste is een commit in het midden van een lus gewoon slecht. In Oracle is het een goede manier om ervoor te zorgen dat andere sessies ORA-01555-fouten krijgen. Dus ik zou dat vermijden als dat mogelijk is.
Ten tweede moet u absoluut weten wat de mogelijke oorzaken zijn voor redelijke fouten bij het invoegen. Je schendt een kolomlengte, een FK, een UK... er is een eindige lijst van wat zou kunnen breken bij het invoegen. Grote, harige bad breaks zoals Kan de tafelruimte niet vergroten, ZOUDEN het systeem tot stilstand moeten brengen. Daar hoef je niet voor op te vallen. Maar applicatieproblemen zoals ik al zei, zijn gemakkelijk te beheren.
Als ik dit zou schrijven, zou ik alle rijen in bulk invoegen met behulp van Oracle's LOG FOUTEN IN om een volledige ROLLBACK te voorkomen wanneer slechts één/enkele rij(en) mislukken.
Nu heb je een tabel die elke mislukte rij bevat en de reden waarom deze is mislukt. Nu kunt u aan de SQL Server-kant alle rijen verwijderen die NIET IN de lijst met mislukte ID's staan.
Je hebt hetzelfde bereikt, maar met op Set gebaseerde bewerkingen in plaats van LANGZAAM VOOR LANGZAAM, oeps, ik bedoel rij voor rij.