Wie liste ich alle Tabellen in allen Schemas auf, die dem aktuellen Benutzer in Postgresql gehören?


25

Ich kann alle Tabellen in allen Schemas mit auflisten

> \dt *.*

Aber das listet auch Systemtabellen auf, die meine Tabellen, die mir am Herzen liegen, deutlich übertreffen. Ich möchte alle von mir erstellten Tabellen (und möglicherweise Sichten) im öffentlichen Schema und in allen von mir definierten Schemas.

Ich hoffe, eine Möglichkeit zu finden, dies zu tun, ohne dem Suchpfad explizit Schemas hinzufügen zu müssen, während ich sie wie hier beschrieben erstelle:

https://stackoverflow.com/a/12902069

BEARBEITEN:

Basierend auf der akzeptierten Antwort habe ich die folgende Ansicht erstellt:

create view my_tables as 
select table_catalog, table_schema, table_name, table_type 
from information_schema.tables 
where table_schema not in ('pg_catalog', 'information_schema');

Und jetzt gibt mir der folgende Befehl, was ich wollte:

select * from my_tables;

Antworten:


32

Dies listet alle Tabellen auf, auf die der aktuelle Benutzer Zugriff hat, nicht nur die, deren Eigentümer der aktuelle Benutzer ist:

select *
from information_schema.tables
where table_schema not in ('pg_catalog', 'information_schema')
and table_schema not like 'pg_toast%'

(Ich bin mir jedoch nicht ganz sicher, ob das not like 'pg_toast%'tatsächlich benötigt wird.)

Wenn Sie die Eigentümerinformationen wirklich benötigen, müssen Sie wahrscheinlich pg_classentsprechende Tabellen verwenden.

Bearbeiten: Dies ist die Abfrage, die die Eigentümerinformationen enthält:

select nsp.nspname as object_schema,
       cls.relname as object_name, 
       rol.rolname as owner, 
       case cls.relkind
         when 'r' then 'TABLE'
         when 'm' then 'MATERIALIZED_VIEW'
         when 'i' then 'INDEX'
         when 'S' then 'SEQUENCE'
         when 'v' then 'VIEW'
         when 'c' then 'TYPE'
         else cls.relkind::text
       end as object_type
from pg_class cls
  join pg_roles rol on rol.oid = cls.relowner
  join pg_namespace nsp on nsp.oid = cls.relnamespace
where nsp.nspname not in ('information_schema', 'pg_catalog')
  and nsp.nspname not like 'pg_toast%'
  and rol.rolname = current_user  --- remove this if you want to see all objects
order by nsp.nspname, cls.relname;

Das ist gut genug. Daraus erstelle ich eine Ansicht namens my_tables.
Peter Groves

Tolle Antwort, füge ein hinzu when 'm' then 'MATERIALIZED_VIEW', um diesen neuen Typ zu zeigen.
Forbesmyester

Eine andere Antwort ist zwar kurz, kann jedoch beim Ausschließen von Namespaces relevant sein .
mlt

18

Die kurze Antwort auf die Frage wäre:

SELECT *
FROM pg_tables t
WHERE t.tableowner = current_user;

-3

Sieh dir das an. Alle Tabellen:

SELECT relname FROM pg_class WHERE relname !~ '^(pg_|sql_)' AND relkind = 'r';
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.