This page (revision-1) was last changed on 03-Aug-2012 16:22 by ThomasBayen 

Only authorized users are allowed to rename pages.

Only authorized users are allowed to delete pages.

Page revision history

Version Date Modified Size Author Changes ... Change note
1 03-Aug-2012 16:22 2 KB ThomasBayen Datentyp aus den Postgres-Metadaten extrahieren

Page References

Incoming links Outgoing links

Version management

Difference between version and

= Metadaten in PostgreSQL =

Wer in Postgres auf die Metadaten der Datenbank zugreifen will, kann das mittels eines SQL-Kommandos, das den sogenannten "Katalog" mit dem Namen '''pg_catalog''' abfragt. Ein Katalog wird benutzt wie ein Datenbank-Schema, sollte allerdings nur gelesen (und nicht beschrieben) werden - Änderungen an der Datenbankstruktur sollten über die [DDL-Befehle|http://www.postgresql.org/docs/8.4/static/ddl.html] der Datenbank gemacht werden.

Im pg_catalog befinden sich [eine Menge Tabellen und Views|http://www.postgresql.org/docs/8.4/static/catalogs.html] mit allen Informationen, die man sich wünschen kann.

Verknüpfungen in diesen Tabellen benutzen als ID zumeist das [versteckte oid-Feld|http://www.postgresql.org/docs/8.4/static/ddl-system-columns.html].

Eine Übersicht über alle Relationen (Tabellen, Views, etc.) findet man in der Tabelle [pg_class|http://www.postgresql.org/docs/8.4/static/catalog-pg-class.html]. Wer sich allerdings nur für Tabellen interessiert, dem hilft evtl. das View [pg_tables|http://www.postgresql.org/docs/8.4/static/view-pg-tables.html] weiter. Einzelne Spaltendefinitionen sind in der Tabelle [pg_attribute|http://www.postgresql.org/docs/8.4/static/catalog-pg-attribute.html] zusammengefasst. Wer z.B. etwas über Datentypen wissen will, kann in [pg_type|http://www.postgresql.org/docs/8.4/static/catalog-pg-type.html] nachsehen.


== Beispiel: Datentyp herausfinden ==

Ich möchte den Datentyp für das Feld "ad_org_id" in der Tabelle "c_order" herausfinden (Beispiel für die [Adempiere]-Datenbank).

 SELECT
   typname, atttypmod, atttypmod >> 16, atttypmod-4 & B'1111111111111111'::integer
   -- ,*
 FROM
   pg_catalog.pg_attribute
   LEFT JOIN pg_catalog.pg_class ON(pg_attribute.attrelid = pg_class.oid)
   LEFT JOIN pg_catalog.pg_type ON(pg_attribute.atttypid = pg_type.oid)
 WHERE
   pg_attribute.attname = 'ad_org_id'
   AND pg_class.relname = 'c_order'
 ;

Das Ergebnis dieser Abfrage ist:

 "numeric";655364;10;0


Der zweite Wert (atttypmod) enthält Zusatzinformationen zum Typ. Bei einem char steht hier die Länge des Strings, bei einem numeric (oder decimal) steht hier die Genauigkeit. Da das allerdings zwei 16-Bit-Werte sind, die in einer 32-Bit-Zahl zusammengefasst sind, habe ich diese in obiger Formel nochmals auseinandergedröselt. Der Datentyp ist also '''NUMERIC(10,0)'''.


[{Tag Datenbank}]