Es gibt eine ganze Reihe von Tools zum Vergleich einzelner Oracle-Datenbankobjekte oder ganzen Schemata auf dem Markt (einige der meistgenannten sind in [1] zusammen gefasst).
Viele dieser Tools vergleichen aber nicht die Inhalte, sondern nur die Definitionen der Datenbankobjekte.
Wenn man einzelne Objekte hingegen mittels Oracle-SQL bzw. PL/SQL auf Unterschiede innerhalb der Datensätze überprüfen wollte, gab es bisher nur die Möglichkeit, mit SET-Operatoren zu arbeiten [2,3] oder die Funktionen ORA_HASH bzw. DBMS_UTILITY.get_hash_value [4] oder DBMS_CRYPTO.hash [5] zu verwenden.
In der Oracle Version 11g wurde für den Vergleich und die Synchronisation von Tabellen (und in eingeschränktem Maße auch Views) das Package DBMS_COMPARISON eingeführt.
Um den Umgang mit diesem Package etwas zu vereinfachen und zu automatisieren, habe ich ein Package Vergleich_11g (vergleich_o11g_Body.sql und vergleich_o11g_Header.sql) erstellt, das die einzelnen Unterprogramme sowie die Abfragen der Data Dictionary Views zusammenfasst.
Da vermutlich die Mehrheit von Ihnen noch nicht auf 11g umgestiegen ist, finden Sie auf unserer Homepage auch ein Package Vergleich_10g (vergleich_o10g_Body.sql und vergleich_o10g_Header.sql, das den Vergleich in 10g möglich macht.
Vorteile der 10g-Version sind die kurzen Laufzeiten (die einzelnen Komponenten von DBMS_COMPARISON, vor allem die Funktion compare nehmen z. T. sehr viel Zeit in Anspruch, nur die Synchronisation geht sehr zügig vonstatten) und die Tatsache, dass man direkt erfahren kann, welche Werte sich unterscheiden.
Allerdings funktioniert die Ermittlung der Unterschiede und die nachfolgende Synchronisation in der vorliegenden Basisversion auf der Grundlage eines Vergleichs der Werte aus 4 Spalten (die Anpassung auf mehr Spalten ist unkompliziert, solange die Gesamtanzahl fix bleibt).
Ein Vergleich aller Spalten erfordert den Einsatz von DBMS_SQL, was das Ganze deutlich komplexer gestaltet hätte.
Daneben finden Sie ein Listing mit Erklärungen und einigen Beispielen für die Nutzung beider Packages sowie Skripte zur Vorbereitung dieser Beispielszenarios (vorbereitung_vergleich_11g.sql und vorbereitung_vergleich_10g.sql
Disclaimer:
Testen Sie die beiden Packages bitte in einer Test-Umgebung an den Beispielen oder unkritischen Tabellen, auf keinen Fall direkt auf einer produktiven Datenbank. Wir übernehmen keine Verantwortung für etwaige Schäden.
Über Feedback, Kritik und Verbesserungsvorschläge würden wir uns sehr freuen.
Voraussetzungen für die Nutzung von DBMS_COMPARISON
Vergleich und Synchronisation erfolgen über folgende Stufen
Die wichtigsten Views zu diesem Package heißen:
Der Name des Vergleichs sollte möglichst sprechend sein und muss den Namenskonventionen folgen (< 30 Zeichen etc.). Innerhalb derselben Datenbank kann kein Vergleich mit demselben Namen erstellt werden, auch nicht von einem anderen User.
Um das Package Vergleich_11g möglichst "handlich" zu gestalten, wurden einige Optionen der Vergleichsdurchführung mittels DBMS_COMPARISON nicht berücksichtigt, u.a.:
Quellen:
1. http://dgielis.blogspot.com/2006/01/compare-2-oracle-schemas.html
2. https://asktom.oracle.com/pls/apex/f?p=100:14:::NO::: (Jan, 2005)
3. http://www.idevelopment.info/data/Oracle/DBA_scripts/Database_Administration/dba_compare_schemas.sql
4. http://tonguc.wordpress.com/2008/03/06/10gs-ora_hash-function-to-determine-if-two-oracle-tables-data-are-equal/
5. http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:41727263557318
6. http://download.oracle.com/docs/cd/B28359_01/server.111/b28324/tdpii_diverge.htm#TDPII090
Mehr zu diesem Thema erfahren Sie auch in unseren Schulungen Neuerungen 11g oder Packages.
In unserer Know-How Datenbank finden Sie mehr als 300 ausführliche Beiträge zu den
Oracle-Themen wie DBA, SQL, PL/SQL, APEX und vielem mehr.
Hier erhalten Sie Antworten auf Ihre Fragen.