Come elencare tutte le viste in SQL in PostgreSQL?


42

Come posso elencare tutte le viste per un database usando un comando SQL in PostgreSQL?

Vorrei qualcosa di simile all'output del \dvcomando psql , ma preferibilmente solo un elenco di nomi di visualizzazione. per esempio,

SELECT ...;
my_view_1
my_view_2
my_view_3

Sto eseguendo PostgreSQL v9.1.4 su Ubuntu Linux.

Risposte:


44

Dalla documentazione :

 select table_name from INFORMATION_SCHEMA.views;

Se non desideri che le visualizzazioni di sistema siano il tuo risultato, prova questo:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))

Grazie @Phil. Tuttavia, quel comando restituisce 128 righe, mentre \ dv restituisce 57 righe. Sembra che mi dia anche viste di sistema, come "tabelle", "colonne", "domini", "pg_role", ecc. Come posso ottenere solo le viste che ho creato?
Rob Bednark,

Ti dà un elenco di quelli a cui hai accesso. Per ottenerne uno per un determinato schema, aggiungi where table_schema='USERNAME'alla query
Philᵀᴹ

@phil Funziona solo se esiste uno schema chiamato in modo identico per l'utente. Di default questo non è il caso, tuttavia c'è lo publicschema.
dezso,

1
INFORMATION_SCHEMA.views mostra solo le visualizzazioni su cui l'utente corrente ha diritto / i. Se ci sono viste nel database su cui l'utente corrente non ha diritto (i) attivo (i), il nome di tali viste non verrà mostrato nel risultato. Dal documento nel link di @ Phil: sono mostrate solo quelle viste a cui l'utente corrente ha accesso (per essere proprietario o avere qualche privilegio).
Cao Minh Tu,

21

Puoi pg_catalog.pg_viewsrichiedere le informazioni desiderate:

select viewname from pg_catalog.pg_views;

Query raffinata per ottenere anche il nome dello schema - nel caso in cui tu abbia più viste con lo stesso nome in schemi diversi - e abbia lasciato fuori quelle viste di sistema:

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

IMHO, in questo modo è meglio che richiedere INFORMATION_SCHEMA.views per i motivi indicati nel mio commento alla risposta di Phil .


4

Se ti serve solo interattivamente mentre psqlsei dentro , puoi anche usare \dvper mostrare le viste o \dmper le viste materializzate. Oppure utilizzare con +, \dm+ad esempio, per mostrare alcune informazioni aggiuntive (utili soprattutto per visualizzare le dimensioni della vista materializzata).


1
\dv *.*e \dm *.* per quelle informazioni su tutti gli schemi!
Pak

3

Provare:

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'
;

Se desideri maggiori dettagli, puoi modificare quanto segue in base alle tue esigenze:

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
;

2

Ho creato un viewper elencare un catalogo di views:

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

E quando voglio vedere tutte le viste nel database scrivo:

select * from show_views;

0

Ecco una query che farà apparire anche le tue viste materializzate e ti mostrerà le dipendenze delle viste.

-- 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
;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.