it-swarm.com.de

Wie liste ich alle Ansichten in SQL in PostgreSQL auf?

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

Ich möchte etwas Ähnliches wie die Ausgabe von psql \dv Befehl, vorzugsweise aber 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.

45
Rob Bednark

Von die 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))
51
Philᵀᴹ

Sie können pg_catalog.pg_views für Ihre gewünschten Informationen:

select viewname from pg_catalog.pg_views;

Verfeinerte Abfrage, um auch den Schemanamen abzurufen - nur für den Fall, dass Sie mehrere Ansichten mit demselben Namen in verschiedenen Schemas 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;

IMHO, dieser Weg ist besser als die Abfrage von INFORMATION_SCHEMA.views aus Gründen, die in meinem Kommentar bis Phils Antwort angegeben sind.

23
Cao Minh Tu

Wenn Sie dies nur interaktiv benötigen, während Sie sich in psql befinden, können Sie auch \dv Zum Anzeigen von Ansichten oder \dm Für materialisierte Ansichten verwenden. Oder verwenden Sie +, Wie z. B. \dm+, Um einige zusätzliche Informationen anzuzeigen (meistens nützlich, um die Größe der materialisierten Ansicht anzuzeigen).

4
Timur

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
;
4
gsiems

Hier ist eine Abfrage, die auch Ihre materialisierten Ansichten aufruft und Ihnen die Abhängigkeiten der Ansichten zeigt.

-- Get a list of views that have dependencies on other views
with view_oids as (
    select
        distinct(dependent_view.oid) as view_oid

    from pg_depend
    JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid
    JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid
    JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
    WHERE
    dependent_ns.nspname = 'public'
), view_dependencies as (
    select
        dependent_view.oid as dependent_oid,
        dependent_ns.nspname as dependent_schema,
        dependent_view.relname as dependent_view,
        source_table.oid as dependency_oid,
        source_ns.nspname as source_schema,
        source_table.relname as source_view
    from pg_depend
    JOIN pg_rewrite ON pg_depend.objid = pg_rewrite.oid
    JOIN pg_class as dependent_view ON pg_rewrite.ev_class = dependent_view.oid
    JOIN pg_class as source_table ON pg_depend.refobjid = source_table.oid
    JOIN view_oids on source_table.oid = view_oids.view_oid
    JOIN pg_namespace dependent_ns ON dependent_ns.oid = dependent_view.relnamespace
    JOIN pg_namespace source_ns ON source_ns.oid = source_table.relnamespace
    WHERE
        source_ns.nspname = 'public'
    group by
        dependent_view.oid,
        dependent_ns.nspname,
        dependent_view.relname,
        source_table.oid,
        source_ns.nspname,
        source_table.relname
)
select 
    view_dependencies.*
from view_dependencies
;
2
Henry Tseng

Ich habe ein view erstellt, um einen Katalog von views aufzulisten:

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 Ansichten in der Datenbank sehen möchte, schreibe ich:

select * from show_views;
2
omar