Ermittlung der Datenbankstruktur

Hallo,
wie kann ich die Datenbankstruktur einer Datenbank mit SQL ermitteln?

ich weiß das es mit pg_dump möglich ist. Aber ich würde gern wissen ob es die möglichkeit auch mit einem oder mehreren SQL-Befehlen gibt.

Was genau willst Du wissen?

  • angelegte Datenbanken
  • angelegte Tabellen
  • angelegte Indexe
  • angelegte views
  • angelegte Funktionen
  • angelegte Trigger



ich weiß das es mit pg_dump möglich ist. Aber ich würde gern wissen ob es die möglichkeit auch mit einem oder mehreren SQL-Befehlen gibt.

Sicher. In psql kannst Du Dir alles mögliche anschauen, mit \dX. Die Onlinehilfe kann Dir helfen. Letztendlich sind das nur Abfragen auf Katalogtabellen. Wie diese Abfragen exakt aussehen, sagt Dir psql, wenn Du es mit -E startest.

Oder suchst Du einfach nur das hier:

kretschmer@KanotixBox:~$ apt-cache show postgresql-autodoc
...
Description: utility to create system tables overview in HTML, DOT and XML
 This is a utility which will run through PostgreSQL system tables and returns
 HTML, DOT, and 2 styles of XML which describes the database.
 .
 The HTML is human readable (via webbrowser). The first style of XML is actually
 the fileformat of Dia, a UML diagram tool. The second type of XML is similar to
 the HTML but in the Docbook 4 format. It enables you to mix in other docbook
 documentation via the XREFs, generating PDFs, HTML, RTF, or other formatted
 documents. Between these tools and JavaDoc with the appropriate XREFs,
 documentation about a project can be generated quickly and be easily updatable
 yet have a very professional look with some DSSSL work.
Tag: devel::docsystem, devel::lang:sql, implemented-in: :p erl, interface::commandline, role: :p rogram, scope::utility, works-with::db, works-with::text, works-with-format::docbook, works-with-format::html

kretschmer@KanotixBox:~$

Andreas

Danke erstmal für deine hilfe :slight_smile:

Genau das möchte ich! Ich Möchte wissen welche DB angelegt wurde und was alles in der DB angelegt wurde, also Tabellen, Indexe, Trigger, etc. Und da wollte ich wissen ob es ne Möglichkeit gibt das via SQL herauszufinden. Ich weiß zum Beispiel das es bei MySQl mit

SHOW CREATE DATABASE [i]db-name[/i]

geht. Aber diese Abfrage hab ich nicht in postgresql gefunden.


Wie heißen die Tabellen? Oder wo kann ich finden wie diese Tabellen heißen?

Die Antwort auf diese Frage wird Dich vermutlich jetzt arg überraschen: in der Doku. Da biste platt, gell? :wink:

PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: System Catalogs

Andreas

oh ha,

danke, das hilft mir jetzt schon erheblich weiter :smiley:

nun noch eine Frage, gibt es ne Möglichkeit wie ich die Struktur der Datenbank bekomme, ähnlich wie mit pg_dump?

mit “pg_dump -d db_name -s > testfile” bekomme ich ja die Struktur der Datenbank in ein Textfile.

Ich möchte nun nicht pg_dump verwenden, sonder einen Befehl, zum Beispiel SQL-befehl oder C-Funktion, der mir die Struktur in Form eines Strings ausgibt.

Mein Ziel ist es das ich die Struktur in ein C-Programm in Form eines Stringsvorliegen hab, den ich dann weiter verarbeiten kann.

Im moment seh ich die Möglichkeit. pg_dump verwenden und das erzeugte Textfile im C-Programm öffnen und die Struktur auslesen.

Die andere Möglichkeit ist die Strutur aus den Katalogtabellen auslesen und zusammenbasteln, was sicher zu großer aufwand ist.

Eine Dritte Möglichkeit sehe ich noch, indem ich mir die Struktur manuell anlege bzw. definiere.

Wie gefragt gibt es eine Möglichkeit die Struktur einer Datenbank in Form von SQL-Befehlen in einem String für ein C-Programm zu ermitteln?

Du könntest pg_dump neu erfinden.

Ich möchte nun nicht pg_dump verwenden, sonder einen Befehl, zum Beispiel SQL-befehl oder C-Funktion, der mir die Struktur in Form eines Strings ausgibt.

Mein Ziel ist es das ich die Struktur in ein C-Programm in Form eines Stringsvorliegen hab, den ich dann weiter verarbeiten kann.

Du möchtest also das, was pg_dump kann, ohne pg_dump zu benutzen.

Im moment seh ich die Möglichkeit. pg_dump verwenden und das erzeugte Textfile im C-Programm öffnen und die Struktur auslesen.

Was genau spricht dagegen?

Die andere Möglichkeit ist die Strutur aus den Katalogtabellen auslesen und zusammenbasteln, was sicher zu großer aufwand ist.

vermutlich.

Eine Dritte Möglichkeit sehe ich noch, indem ich mir die Struktur manuell anlege bzw. definiere.

Wie gefragt gibt es eine Möglichkeit die Struktur einer Datenbank in Form von SQL-Befehlen in einem String für ein C-Programm zu ermitteln?

Du nanntest bereits die 2 sinnvollsten Möglichkeiten. Wenn es Dir zu blöd ist, pg_dump aufzurufen, dann programmiere es nach. Als Vorlage kannst Du ja den Quelltext nehmen. Wenn Dir das Format von pg_dump nicht gefällt, kann man das auch umformen, Texttools gibt es wie Sand am Meer(sed, awk, perl, …)



Andreas

ok… also ist pg-dump die sinnvollste Lösung.

Ich bin kein Experte in C. Daher eine Frage. Wie kann ich innerhalb eines C-Programms pg_dump Aufrufen, wenn das C-Programm auf einen Client läuft und Postgresql auf nen Server?


wo wir gerade bei dump sind. Ich habe gerade ein problem mit pg_restore.

ich will eine Datenbank wiederherstellen, wenn diese zum Beispiel versehendlich gelöscht wurde. Dabei soll nur die Datenbank und ihre Struktur angelet werden, die ich voher mit pg_dump gesichert hab.

Ich hatte folgende befehle ausgeführt.

pg_dump db_test2 -s -Ft > ablage2

Zum Versuch habe ich die test-datenbank db_test2 gelöscht.

pg_restore -d db_test2 -C -s ablage2

Hier wurde mir dann folgende fehlermeldung ausgegeben:
“pg_restore: [archiver (db)] connection to database “db_test2” failed: FATAL: database “db_test2” does not exist”

was mach ich falsch??

es soll db_test2 angelegt werden udn dann die struktur wiederhergestellt werden.

-C
–create
Erzeugt die Datenbank, bevor Daten in sie geladen werden. (Wenn diese Option verwendet wird, wird die
durch -d genannte Datenbank nur verwendet, um den Befehl CREATE DATABASE am Anfang auszufüh-
ren. Alle Daten werden in der im Archiv genannten Datenbank wiederhergestellt.)

Installier pg_dump auf dem Client und rufe das aus Deinem C-Programm dann auf. Pg_dump kann über das Netzwerk arbeiten.

Ich hatte folgende befehle ausgeführt.

pg_dump db_test2 -s -Ft > ablage2

>
> Zum Versuch habe ich die test-datenbank db_test2 gelöscht.
>
> ```text
pg_restore -d db_test2 -C -s ablage2

Hier wurde mir dann folgende fehlermeldung ausgegeben:
“pg_restore: [archiver (db)] connection to database “db_test2” failed: FATAL: database “db_test2” does not exist”

was mach ich falsch??

Du versuchst, Dich zu einer nichtexistenten DB zu connecten. Verwende template0 oder template1 anstelle der wiederherzustellenden DB. Allerdings wäre es wohl besser gewesen, pg_dump auch mit -C zu machen…
(ich bin mir jetzt nicht sicher, ob bei -Ft im Dump der Name der DB enthalten ist, um beim Restore in diese DB nach Erstellung zu wechseln)

Andreas

Jo Danke :slight_smile:

restore geht wenn ich beim pg_dump auch -C angebe

gute Idee

kann man pg_dump und pg_restore einzeln auf dem Client installieren?
Im moment hab ich nix gefunden wie das geht, außer man installiert postgresql ganz.

Ja.

Im moment hab ich nix gefunden wie das geht, außer man installiert postgresql ganz.

apt-get install postgresql-client-VERSION


Andreas

Also akretschmer hat Recht, du solltest auf keinen Fall versuchen, das Rad neu zu erfinden. Speziell, wenn es um Zugriffe auf die Systemkataloge geht. Diese ändern sich auch schon mal von Version zu Version un dpg_dump ist hier a) aktuell informiert und kommt b) auch mit älteren Datenbankversionen zurecht.

Zur reien Information könntest du allerdings auch mal einen Blick in das “information_schema” werfen.

Ach, btw, zur Aussage, das du kein Experte in C bist: gerade bei dieser Sprache solltest du schon einigermassen sicher sein, wie du damit umgehst. Ansonsten baust du dir ggf. mehr Probleme und Sicherheitslücken ein, als dir lieb sind.

danke für eure Tipps… haben mir echt weiter geholfen. Und das Rad werde ich auch nicht neu erfinden :wink:

In C komm ich ganz gut klar. Ich kenn halt noch nicht alles. Bin noch recht am anfang mit C-Programmierung. Mach das erst seit 3 Jahren im Studium.

Ist halt nen recht großes gebiet. :slight_smile:


Ich hätte da auch mal gleich noch ne Frage. Wie kann ich die Kodierung einer Datenbank ändern?

Hab bis jetzt keinen Befehl dafür gefunden. Hab ne Testdatenbank erstellt und diese nicht auf UTF8 eingestellt und wollte das noch ändern!

Google: “postgresql change database encoding”, 2. Treffer.

Andreas

Jo danke für die Hilfe!! :smiley: