# ERModel der Datebanken (ORACLE,MySQL,MS-SQL usw)



## rwolf (5. Okt 2016)

hi all,

es geht um die Erstellung eines möglichst universellen Tools zum Kopieren von
Daten (zunächst mal einzelner Tabellen) zwischen zwei Datenbanken auf ganz verschiedenen URL's (z.B.  Source : IP-Adresse\Servername nach Target : IP-Adresse\Servername).

Mit MS-SQL und MySQL klappt das schonmal in beiden Richtungen 
Dabei bin ich aber erstmal von dbo als Standard-Schema bei MS-SQL und <kein Schema>
bei MySQL ausgegangen; bei ORACLE(hier erstmal 11g Testversion) falle ich damit aber "voll auf die Schnauze" 

Mit den Connections hab ich bisher kein Problem, aber mit den Metadaten..

Meines Wissen gibt es bei den meisten DB's Schemata, aber wo gibt es - auch für Opa - verständliche ER-Modelle (möglichst grafisch) ?
bei ORACLE hab ich da mal was gesehen, aber das ist kaum verständlich, weil zuviel anderes mit in die Grafik eingebaut wird

Es geht also um die "Entitäten" Datenbank, Schema,User,Tabelle und um die Aufschlüsselung
per Metadaten mithilfe von Java !

bitte somit um Mithilfe  bei der Suche nach entsprechenden Doks für zumindest MYSQL,MSSQL,ORACLE,IBM DB2, postgres,SYBASE(noch da ?)

anbei noch ein Screenshot aus der Serverdefinition des bisherigen Kopiertools..


----------



## stg (5. Okt 2016)

Was willst du denn mit irgendwelchen ER-Diagrammen anfangen? Willst du aus der einen Datenbank jeweils ein ER-Diagramm generieren und dann daraus auf der anderen Datenbank wieder das Schema generieren?
Wieso nicht einfach direkt per SQL? Sind doch alles SQL Datenbanken, die du da aufführst.... und du wirst dich vermutlich eh auf den kleinsten gemeinsamen Nenner einschränken müssen, andernfalls wird das ein Projekt, das du alleine sicherlich nicht in angemessener Zeit bewerkstelligen kannst.

Speziell zu Oracle kann da das package DBMS_METADATA und hier insbesondere die Funktion GET_DDL(...) für dich interessant sein. 
Beispiel: 
	
	
	
	





```
SELECT DBMS_METADATA.GET_DLL('TABLE','DEINE_TABELLE') FROM DUAL;
```
Das liefert dir zB direkt das SQL statement zum Erzeugen der Tabelle 'DEINE_TABELLE'


----------



## rwolf (5. Okt 2016)

hallo stg,

ich befürchte, daß meine Fragestellung nicht so ganz verstanden wurde..

bei MS-SQL und bei MySQL bin ich von der
Hierarchie Server(URL) -> DB -> Tabellen -> Tabellenfelder ausgegangen,
d.h. für Quelle und Ziel des Kopiervorganges habe ich ne Server-URL angegeben,
bekam damit per Metadaten die zum Server gehörigen Datenbanken -> davon eine ausgewählt,
bekam ich die Tabellen zu dieser DB -> aus den Tabellen eine ausgewählt bekam ich die Felder :
alles klar zur Erzeugung der SELECT- und INSERT-Skripte

bei ORACLE ist es aber wohl so , daß mit dem Einloggen auf dem Server auch über den User
das Schema zum USER und damit auch die Tabellenmenge festgelegt sind..von der Datenbank
ist in den Beispielskripten Nicht die Rede : so z.B. werden die Schemata gelesen mit :


```
ResultSet rscSh = dbmtd.getSchemas();
while(rscSh.next())
         System.out.println(rscSh.getString("TABLE_SCHEM"));[/I]
// --> kriegt man ein oder mehrere Schemata:)

                String   catalog          = null;
                String   schemaPattern    = "ORAWOLF";
                String   tableNamePattern = null;
                String[] types            = null;

                ResultSet resTables = dbmtd.getTables(
                    catalog, schemaPattern, tableNamePattern, types );

                while(resTables.next())
                {
                    String tableName = resTables.getString(3);
                    System.out.println("ora_analyze_test1 TableName : "+tableName);
                }
// -->kriegt man eine oder mehrere Tabellenamen;)
```

was sind  'Kataloge' bei ORACLE ?
mit folgendem kommt absolut NICHTS :


```
ResultSet rscCtlg = dbmtd.getCatalogs();
      while(rscCtlg.next())
         System.out.println("ora_analyze_test1 rsCatalogs :                   
                                                "+rscCtlg.getString("TABLE_CAT"));
```


man versteht jetzt hoffentlich besser , warum für ORACLE ein ER-Modell hilfreich wäre..


----------



## stg (5. Okt 2016)

rwolf hat gesagt.:


> bei ORACLE ist es aber wohl so , daß mit dem Einloggen auf dem Server auch über den User
> das Schema zum USER und damit auch die Tabellenmenge festgelegt sind..von der Datenbank
> ist in den Beispielskripten Nicht die Rede



Ja, das ist auch so. Ein 100% Analogon zu "Datenbanken" in MySQL o.Ä. gibt es bei Oracle nicht. Zumindest für Oracle 11g (und frühere Version) läuft auf einem Oracle-"Server" (nicht physischer Server, sondern "Dienst") _genau eine _Datenbank. 



rwolf hat gesagt.:


> bei MS-SQL und bei MySQL bin ich von der
> Hierarchie Server(URL) -> DB -> Tabellen -> Tabellenfelder ausgegangen,



Wenn du mit entsprechenden Rechten angemeldet bist, dann kannst du auch unter Oracle alle existierenden Scheema / User abfragen. Das kommt den "Datenbanken" in MySQL usw. wohl am nächsten. Aber als empfehlenswert erachte ich das nicht. 

Auf die ganzen JDBC-Methode zum Abrufen der META-Daten würde ich mich auch nicht wirklich verlassen. Da ist viel gar nicht oder nur unzureichend implementiert. 

Was die Methode getCatalogs() zurückliefern soll, kann ich nur raten. Ich kenne Catalogs als eine Art zusätzliche Scheemas, die man zur Wiederherstellung von Daten nutzt. Dann gibts noch Catalog views .... aber wie auch immer, ich bin alles andere als ein DB Admin. Ich kenne Oracle Datenbank in erster Linie nur von der Anwender-Seite her. Wenn deine Fragen spezieller werden, dann ist das hier vermutlich auch nicht mehr das richtige Forum für dich.

Aber insgesamt seh ich immer noch nicht die großartigen Probleme oder was deine eigentliche Frage nun tatsächlich umfasst. Ich hab bisher so viel verstanden, dass du Tabellen (und / oder deren Inhalte?) von A nach B kopieren willlst. 

Wenn du ein wenig basischer einfach nur Tabellen und Tabellen-Felder auslesen willst, dann schau dir mal `USER_TABLES` und `USER_TAB_COLUMNS` an.



rwolf hat gesagt.:


> man versteht jetzt hoffentlich besser , warum für ORACLE ein ER-Modell hilfreich wäre..



...nicht so wirklich


----------



## rwolf (5. Okt 2016)

hallo stg,
erstmal vielen vielen Dank für Deine "Anteilnahme" !

ich hab halt gemeint, man könne bei ORACLE die ganzen Metadaten mit SQL
holen, 
z.B. in SQL-Plus  : SELECT ora_database_name FROM dual;
gibt mir den Namen der aktuellen Datanbank 

darauf aufbauend wollte ich mit SQL etwa folgendes machen : (PSEUDO-SQL) :
1.) SELECT <databases> FROM <server>
2.) SELECT <schemata> FROM <databases> WHERE database = selected-DB
3.) SELECT <tables> FROM <schemata> WHERE schema = selected-schema
4.) get Metadata FROM table
das funzt bei mir mit MS-SQL und MYSQL(da ohne Schema), aber eben Nicht mir ORACLE..

für so  eine Konstruktion wäre ein ER-Model halt hilfreich..

weiß übrigens jemand, wie das bei IBM_DB2 ist ?

mittlerweile krieg ich jetzt meine Metadaten in mein Programm
gemäß der im Erstbeitrag gezeigten Grafik (Screenshot), nur
daß in der Liste links die einzige DB steht..


----------

