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.
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))
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 .
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).
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
;
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
;
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;