|
Nützliche PL/SQL Packages: Einfaches Generieren von DDL-Kommandos mit DBMS_METADATA und DBMS_METADATA_DIFF
von Ulrike Schwinn, ORACLE Deutschland GmbH
Wie kann man festellen, mit welchen Eigenschaften d.h. mit welchem DDL-Kommando, eine Tabelle erzeugt worden ist?
Welche Indizes, Trigger usw. gehören zu einer gewissen Tabelle? Skripte, die Abfragen auf die entsprechenden
Data Dictionary Views wie USER_TABLES, USER_INDEXES usw. ausführen, könnten eine mögliche Lösung darstellen.
Diese Skripte sind unter Umständen sehr aufwändig und komplex und müssen gegebenenfalls pro Datenbankrelease angepasst
werden.
Schon seit Oracle Version 9i ist es möglich, diese Aufgabe durch einfache Aufrufe des PL/SQL Package
DBMS_METADATA zu generieren. Das Package ist ohne zusätzliche Installation in jeder Datenbank-Edition
vorhanden und nutzbar. Intern wird die Technologie zum Beispiel bei der Nutzung von Oracle Data Pump
oder im Oracle SQL Developer verwendet. Das DBMS_METADATA Package nutzt das universelle XML Format
als Ausgabeformat und bietet zur Vereinfachung eine automatische Transformation mit XSLT (Extensible Stylesheet Language
Transformation) in SQL DDL-Kommandos an. Das Package ist sehr mächtig und kann entweder in einfachen SQL Abfragen oder
auch in Applikationen genutzt werden.
In folgendem Tipp konzentrieren wir uns auf die einfache Generierung von DDL-Statements, um mit ad-hoc
Abfragen systemrelevante DDL-Befehle aus der Datenbank zu generieren. Zur Realisierung stehen dabei beispielsweise folgende
GET-Funktionen zur Verfügung:
- GET_DDL
- GET_DEPENDENT_DDL
- GET_GRANTED_DDL
Folgendes Beispiel (Listing 1) zeigt eine erste Anwendung. Zur besseren Lesbarkeit wurden die SQL*Plus Formatierungen
LONG, PAGESIZE und HEADING angepasst.
Generell ist bei allen GET-Aufrufen die Angabe von Typ (OBJECT_TYPE) und Name (NAME) des Objekts erforderlich. Folgende Auflistung zeigt einen
Ausschnitt aus den vordefinierten Objekttypen:
- TABLE
- INDEX
- SYNONYM
- TRIGGER
- PROCEDURE
- ROLE_GRANT
...
Eine vollständige Auflistung ist im Handbuch Oracle Supplied PL/SQL Packages and Types References in Tabelle 84-11 zu finden.
Schemaspezifische Angaben sind beim Aufruf nicht möglich, so dass der Aufruf immer für den aktuell verbundenen User erfolgt.
Zuerst muss daher die Verbindung mit dem entsprechenden Tabellenbesitzer - in Listing 1 der User SCOTT - hergestellt werden, um die Information
zur Tabelle EMP generieren zu können.
Werkzeuge wie der SQL*Developer nutzen diese Technologie intern und bringen das DDL-Kommando folgendermassen zur Anzeige.
Für eine größere Ansicht auf das Bild klicken
Mit dem Data Pump-Werkzeug lässt sich das Ganze folgendermassen realisieren:
Die erzeugte Datei expdat.dmp enthält dabei nicht nur das CREATE-Kommando für die Tabelle EMP, sondern auch
die Kommandos um abhängige Objekte mit den zugehörigen GRANT-, CREATE TRIGGER- Befehlen usw. zu erzeugen. In einem späteren Abschnitt
werden wir zeigen, wie man auch diese Information mit der DBMS_METADATA API generieren kann.
In allen Fällen sind die erzeugten CREATE-Kommandos vollständig und beinhalten auch die Storage-Informationen
der Tabelle. Soll diese Information unterdrückt werden, kann zuvor die Prozedur SET_TRANSFORM_PARAM angewendet werden.
SET_TRANSFORM_PARAM enthält drei Argumente. Das erste Argument mit DBMS_METADATA.SESSION_TRANSFORM
zeigt an, dass die Einstellung für die gesamte Session gelten soll. Das zweite und dritte Argument gibt die
Bezeichnung und den Wert für die Veränderung an. In unserem Fall soll der Storage-Anteil weggelassen
und das SQL-Kommando mit einem Semikolon (';') abgeschlossen werden.
Auch hier ist ein Vergleich mit dem Data Pump- Werkzeug möglich. Der Parameter TRANSFORM mit dem Wert STORAGE:N
unterbindet die Storage-Information. Der Wert SEGMENT_ATTRIBUTES:N unterdrückt die Segment-Attribute.
Möchte man alle Tabellen eines Datenbank-Schemas in einer einzigen Abfrage generieren, zieht man die Data Dictionary View
USER_TABLES zur Abfrage hinzu. Der folgende Aufruf zeigt die Ausgabe aller Tabellen eines Schemas:
Wie sehen nun die abhängigen Objekte wie Indizes, Synonyme, Trigger usw. aus? Die Funktion GET_DEPENDENT_DDL
liefert unter Angabe des entsprechenden Objekttyps die zugehörigen DDL-Kommandos. Das folgende Listing zeigt die
Informationen zu Triggern der Tabelle EMP:
Eine vollständige Liste der möglichen Objekttypen, die im Aufruf GET_DEPENDENT_DDL verwendet werden können, ist
im Handbuch Oracle Supplied PL/SQL Packages and Types References in Tabelle 84-11 zu finden. Die Spalte Attributes in dieser Tabelle beschreibt die einzelnen Objekttypen und gibt damit Aufschluss darüber, welcher
Objekttyp in welchem Funktionsaufruf verwendet werden kann.
Komplexe Anwendungen
Benötigt man beispielsweise CREATE USER-Kommandos und die zugehörigen Privilegien zur Einrichtung eines Testsystems
oder im Rahmen einer Migration mit Transportable Tablespace, kann der Einsatz von DBMS_METADATA hilfreich sein.
CREATE USER-Skripte lassen sich zum Beispiel ganz einfach mit folgendem DBMS_METADATA.GET_DDL-Befehl erzeugen.
In unserem Spezialfall wird die SUBSTR-Funktion verwendet, um das CREATE USER-Kommando nach der Ausgabe des Passworts
abzuschneiden und auf diese Weise die Informationen über den DEFAULT TABLESPACE usw. zu unterdrücken.
Das letzte Beispiel erläutert die Funktionsweise der API am Beispiel der GRANT Befehl-Generierung.
Die Pipelined Table- Funktion GET_GRANTS nutzt die Programm-API OPEN, FETCH_CLOB, ADD_TRANSFORM und CLOSE, um die
zugehörigen GRANT-Befehle zu generieren.
Das Ergebnis kann dann folgendermassen aussehen.
Es gibt sehr viele Möglichkeiten mit DBMS_METADATA zu arbeiten. Möchte man zum Beispiel zwei Schemas miteinander
vergleichen, könnte man mit dem Package DBMS_METADATA, alle neuen Tabellen auslesen. Michael Ritz von Oracle Consulting
hat dazu folgendes Skript zur Verfügung gestellt.
Vergleich von Metadaten-Strukturen
Neu in 11g Release 2 ist das Package DBMS_METADATA_DIFF, das eine interessante Erweiterung zum oben erläuterten DBMS_METADATA-Package
liefert. Damit können zwei Objekte (z.B. Tabellen, Indizes usw.) im gleichen Schema oder unterschiedlichen Schemas miteinander verglichen,
die Unterschiede dokumentiert und sogar die entsprechenden Statements, um die Objekte anzugleichen, generiert werden. Dabei können die
Tabellen auch in unterschiedlichen Datenbanken liegen.
Hinweis: Es müssen folgende Voraussetzungen erfüllt sein:
- Oracle XML DB muss installiert sein.
- Oracle Enterprise Manager Change Management Pack muss lizenziert sein.
Um die Funktionsweise zu demonstrieren, werden die beiden Funktionen COMPARE_SXML und COMPARE_ALTER in den folgenden Beispielen verwendet.
Grundlage ist der Einsatz des XML-Dialekts SXML. SXML ist eine XML-Repräsentation der Objektmetadaten, die eine direkte
Übersetzung von DDL-Statements in XML darstellt. Um einen Einblick in SXML zu bekommen, vergleichen wir in folgendem Listing
die SXML-Darstellung der Tabellen EMP im SCOTT- bzw. im PARTNER- Schema.
Die Namen der Tags (wie z.B. SCHEMA, NAME, DATATYPE etc.) entsprechen der verwendeten Terminologie des Handbuchs Oracle Database SQL Language
Reference. Zeigen sich Unterschiede in den beiden SXML-Dokumenten, wird der entsprechenden Knoten bzw. das entsprechende Element mit "src" bzw. mit
"value1" oder "value2" gekennzeichnet. In unserem Fall gibt es beispielsweise Unterschiede in der Schemaverwendung (im Beispiel: value1="PARTNER"), der Nutzung der
Primary Key-Spalte (im Beispiel: <PRIMARY_KEY_CONSTRAINT_LIST src="2">) und der ENAME Spalte (im Beispiel: <COL_LIST_ITEM src="2"> <NAME>ENAME</NAME>).
Die Komplexität der Ausgabe hängt dabei vom verwendeten Objekttyp ab. Valide Objekttypen sind
CLUSTER, CONTEXT, DB_LINK, FGA_POLICY, INDEX, MATERIALIZED_VIEW, MATERIALIZED_VIEW_LOG, QUEUE, QUEUE_TABLE, RLS_CONTEXT, RLS_GROUP,
RLS_POLICY, ROLE, SEQUENCE, SYNONYM, TABLE, TABLESPACE, TRIGGER, TYPE, TYPE_SPEC, TYPE_BODY, USER und VIEW.
Möchte man die zugehörigen Statements generieren, um die Unterschiede anzupassen, kann dies mit folgendem einfachen Kommando erfolgen.
Das Ergebnis listet die zugehörigen ALTER-Statements und DBMS_METADATA- Aufrufe, die zur Anpassung der Tabelle EMP im
Schema PARTNER führt.
Mehr zu diesem Thema lesen Sie in den nächsten Ausgaben ...
Zurück zur Community-Seite
|