Comment lister toutes les vues en SQL dans PostgreSQL?


42

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 de la \dvcommande psql , 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'exécute PostgreSQL v9.1.4 sur Ubuntu Linux.

Réponses:


44

De la documentation :

 select table_name from INFORMATION_SCHEMA.views;

Si vous ne voulez pas que le système affiche votre résultat, essayez ceci:

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

Merci @Phil. Cependant, cette commande renvoie 128 lignes, alors que \ dv renvoie 57 lignes. Cela semble également me donner des vues système, telles que "tables", "colonnes", "domaines", "pg_role", etc. Comment obtenir uniquement les vues que j'ai créées?
Rob Bednark

Il vous donne une liste de ceux auxquels vous avez accès. Pour obtenir les uns pour les autres pour un schéma donné, ajoutez where table_schema='USERNAME'à la requête
Philᵀᴹ

@phil Ceci ne fonctionne que s'il existe un schéma portant le même nom pour l'utilisateur. Ce n'est pas le cas par défaut, cependant, il y a le publicschéma.
dezso

1
INFORMATION_SCHEMA.views n'affiche que les vues sur lesquelles l'utilisateur actuel a le droit. S'il existe des vues dans la base de données sur lesquelles l'utilisateur actuel n'a pas les droits, le nom de ces vues ne sera pas affiché dans le résultat. Extrait du document dans le lien de @ Phil: Seules les vues auxquelles l'utilisateur actuel a accès (en tant que propriétaire ou disposant de certains privilèges) sont affichées.
Cao Minh Tu

21

Vous pouvez rechercher pg_catalog.pg_viewsvos informations souhaitées:

select viewname from pg_catalog.pg_views;

Requête raffinée pour obtenir également le nom du schéma - au cas où vous auriez plusieurs vues avec le même nom dans différents schémas - et en laissant 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;

IMHO, cette façon est meilleure que la requête INFORMATION_SCHEMA.views pour les raisons énoncées dans mon commentaire à la réponse de Phil .


4

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


1
\dv *.*et \dm *.* pour ces informations sur tous les schémas!
Pak

3

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 ce qui suit pour répondre à 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
;

2

J'ai créé un viewpour 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 de la base de données, j'écris:

select * from show_views;

0

Voici une requête qui affichera également vos vues matérialisées et vous montrera les dépendances de celles-ci.

-- 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
;
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.