Wie liste ich alle Ansichten in SQL in PostgreSQL auf?

40

Wie liste ich alle Ansichten für eine Datenbank mit einem SQL-Befehl in PostgreSQL auf?

Ich möchte etwas Ähnliches wie die Ausgabe des \dvBefehls psql , aber vorzugsweise nur eine Liste von Ansichtsnamen. z.B,

SELECT ...;
my_view_1
my_view_2
my_view_3

Ich verwende PostgreSQL v9.1.4 unter Ubuntu Linux.

Rob Bednark
quelle
Kannst du eine Antwort wählen?
Evan Carroll

Antworten:

42

Aus der Dokumentation :

 select table_name from INFORMATION_SCHEMA.views;

Wenn Sie nicht möchten, dass die Systemansichten Ihr Ergebnis sind, versuchen Sie Folgendes:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))
Philᵀᴹ
quelle
Danke @Phil. Dieser Befehl gibt jedoch 128 Zeilen zurück, während \ dv 57 Zeilen zurückgibt. Es scheint mir auch Systemansichten zu geben, wie "Tabellen", "Spalten", "Domänen", "pg_role" usw. Wie erhalte ich nur die Ansichten, die ich erstellt habe?
Rob Bednark
Es gibt Ihnen eine Liste derjenigen, auf die Sie Zugriff haben. where table_schema='USERNAME'
Fügen Sie
@phil Dies funktioniert nur, wenn es ein Schema gibt, das dem Benutzer identisch ist. Standardmäßig ist dies nicht der Fall, es gibt jedoch das publicSchema.
Dezso
1
INFORMATION_SCHEMA.views zeigt nur die Ansichten an, für die der aktuelle Benutzer Rechte hat. Wenn die Datenbank Ansichten enthält, für die der aktuelle Benutzer keine Rechte besitzt, wird der Name dieser Ansichten im Ergebnis nicht angezeigt. Aus dem Dokument in @ Phils Link: Es werden nur die Ansichten angezeigt, auf die der aktuelle Benutzer Zugriff hat (entweder als Eigentümer oder mit bestimmten Berechtigungen).
Cao Minh Tu
21

Sie können pg_catalog.pg_viewsIhre gewünschten Informationen abfragen :

select viewname from pg_catalog.pg_views;

Die Abfrage wurde verfeinert, um auch den Schemanamen abzurufen - für den Fall, dass Sie mehrere Ansichten mit demselben Namen in verschiedenen Schemata haben - und diese Systemansichten weggelassen:

select schemaname, viewname from pg_catalog.pg_views
where schemaname NOT IN ('pg_catalog', 'information_schema')
order by schemaname, viewname;

Meiner Meinung nach ist dieser Weg aus den in meinem Kommentar zu Phils Antwort genannten Gründen besser als die Abfrage von INFORMATION_SCHEMA.views .

Cao Minh Tu
quelle
4

Wenn Sie dies nur interaktiv benötigen psql, können Sie es auch \dvzum Anzeigen von Ansichten oder \dmfür materialisierte Ansichten verwenden. Oder verwenden Sie mit +, um \dm+zum Beispiel einige zusätzliche Informationen anzuzeigen (meist nützlich, um die Größe der materialisierten Ansicht zu sehen).

Timur
quelle
1
\dv *.*und \dm *.* für diese Informationen zu allen Schemata!
Pak
3

Versuchen:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
    WHERE c.relkind  = 'v'
;

Wenn Sie mehr Details wünschen, können Sie Folgendes an Ihre Bedürfnisse anpassen:

SELECT  n.nspname AS table_schema,
        pg_catalog.pg_get_userbyid(c.relowner) AS table_owner,
        c.relname AS table_name,
        s.n_live_tup AS row_count,
        count (a.attname) AS column_count,
        pg_catalog.obj_description(c.oid, 'pg_class') AS comments,
        CASE c.relkind
            WHEN 'v'
            THEN pg_catalog.pg_get_viewdef(c.oid, true)
            ELSE null
            END AS query
    FROM pg_catalog.pg_class c
         LEFT JOIN pg_catalog.pg_namespace n ON (n.oid = c.relnamespace)
         LEFT JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid AND a.attnum > 0 AND NOT a.attisdropped)
         LEFT JOIN pg_catalog.pg_stat_all_tables s ON (c.oid = s.relid)
    WHERE c.relkind  = 'v'
GROUP BY n.nspname,
        c.relowner,
        c.relkind,
        c.relname,
        s.n_live_tup,
        c.oid
ORDER BY n.nspname,
        c.relname
;
gsiems
quelle
2

Ich habe ein erstellt, viewum einen Katalog mit folgenden Elementen aufzulisten views:

create or replace view show_views as 
select table_name from INFORMATION_SCHEMA.views 
WHERE table_schema = ANY (current_schemas(false));

Und wenn ich alle Views in der Datenbank sehen will, schreibe ich:

select * from show_views;
omar
quelle