= 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}]