Pflichtfelder aus view-Definition ermitteln

Hallo,

ich suche eine Möglichkeit, aus den Systemtabellen zu erfahren, ob die Spalte eines Views in der zugrundeliegenden Tabelle ein Pflichtfeld ist.

Für Tabellen erhalte ich diese Info in folgendem View, der mir alle Spalten aller Tabellen und View anzeigt:

SELECT pg_namespace.nspname AS schema, pg_class.relname AS tabelle, pg_attribute.attname AS spalte, pg_type.typname AS typ,
CASE
WHEN pg_attribute.atttypmod > 0 THEN pg_attribute.atttypmod - 4
ELSE NULL::integer
END AS laenge, pg_attribute.attnotnull AS pflicht
FROM pg_attribute
JOIN pg_class ON pg_class.oid = pg_attribute.attrelid
JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
JOIN pg_type ON pg_attribute.atttypid = pg_type.oid
WHERE pg_attribute.attstattarget <> 0;

Gibt es einen Weg, bei Views mehr über die Spalte zu erfahren??

darueber bin ich auch mal gestolpert …

je nachdem wie man die anforderung formuliert macht “pflichtfeld” sinn oder eben nicht …

der theorie nach haben views keine pflichtfelder weil sie eigentlich sowieso nicht beschreibbar sind - dass man sie updatefaehig erzeugen kann steht auf einem anderen blatt …

du kannst nun fragen, wie du ermitteln kannst - ob ein bestimmtes beteiligtes feld einer bestimmten tabelle ein pflichtfeld ist … -> INFORMATION_SCHEMA

auf jeden fall ist das nicht so einfach zu lösen wie bei einem select auf eine oder mehrere tabellen (joins) … z.B. ueber die DB-Schnittstelle die du verwendest … was schade ist.

gibt es eine Möglichkeit, unter information_schema.view_column_usage die Spalten-Nr anzuzeigen??? unter information_schema.columns gibt es ja die ordinal_position…

welche spalten-nr?

die Position im view

die gibt es nicht …

ich wuerde an deiner stelle ueberdenken ob du die position wissen musst - und warum …

ansonsten hilft da nur ein

SELECT * FROM view LIMIT 0

und die schnittstelle fragen

i.d.R. sollte “die position” für den client nicht wichtig sein … ich habe aber verstaendnis fuer solche begehrlichkeiten :wink:

Nachtrag:

EXPLAY ANAYLSE
SELECT * FROM my_view limit 0

Nur keine Angst:

"Limit  (cost=0.00..0.07 rows=1 width=431) ([color="Red"]actual[/color] time=0.001..0.001 [color="Red"]rows=0[/color] loops=1)"
"  ->  Seq Scan on my_view  (cost=0.00..18136.75 rows=[color="#ff0000"]250475[/color] width=431) ([color="Red"]never executed[/color])"
"Total runtime: 0.080 ms"