web-dev-qa-db-fra.com

Comment lister toutes les vues en SQL dans PostgreSQL?

Comment répertorier toutes les vues d'une base de données à l'aide d'une commande SQL dans PostgreSQL?

Je voudrais quelque chose de similaire à la sortie du psql \dv, mais de préférence juste une liste de noms de vues. par exemple.,

SELECT ...;
my_view_1
my_view_2
my_view_3

J'utilise PostgreSQL v9.1.4 sur Ubuntu Linux.

45
Rob Bednark

De la documentation :

 select table_name from INFORMATION_SCHEMA.views;

Si vous ne voulez pas que les vues du système soient votre résultat, essayez ceci:

 select table_name from INFORMATION_SCHEMA.views WHERE table_schema = ANY (current_schemas(false))
51
Philᵀᴹ

Vous pouvez interroger pg_catalog.pg_views pour vos informations souhaitées:

select viewname from pg_catalog.pg_views;

Requête affinée pour obtenir également le nom du schéma - juste au cas où vous avez plusieurs vues avec le même nom dans différents schémas - et laisser de côté ces vues système:

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

À mon humble avis, cette méthode est meilleure que la requête INFORMATION_SCHEMA.views pour les raisons indiquées dans mon commentaire à réponse de Phil .

23
Cao Minh Tu

Si vous n'en avez besoin que de manière interactive dans psql, vous pouvez également utiliser \dv pour afficher les vues, ou \dm pour les vues matérialisées. Ou utilisez avec +, comme \dm+ par exemple pour afficher des informations supplémentaires (surtout utiles pour voir la taille de la vue matérialisée).

4
Timur

Essayer:

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

Si vous souhaitez plus de détails, vous pouvez modifier les éléments suivants en fonction de vos besoins:

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

Voici une requête qui fera également apparaître vos vues matérialisées et vous montrera les dépendances des vues.

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

J'ai créé un view pour lister un catalogue de views:

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

Et quand je veux voir toutes les vues dans la base de données, j'écris:

select * from show_views;
2
omar