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 der Datenbank gemacht werden.
Im pg_catalog befinden sich eine Menge Tabellen und Views mit allen Informationen, die man sich wünschen kann.
Verknüpfungen in diesen Tabellen benutzen als ID zumeist das versteckte oid-Feld.
Eine Übersicht über alle Relationen (Tabellen, Views, etc.) findet man in der Tabelle pg_class. Wer sich allerdings nur für Tabellen interessiert, dem hilft evtl. das View pg_tables weiter. Einzelne Spaltendefinitionen sind in der Tabelle pg_attribute zusammengefasst. Wer z.B. etwas über Datentypen wissen will, kann in pg_type 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).