it-swarm.com.de

Gibt es einen postgres-Befehl zum Auflisten/Löschen aller materialisierten Ansichten?

Ich erstelle mehrere Ansichten in meinem Code und möchte jedes Mal, wenn der Code ausgeführt wird, alle bisher generierten materialisierten Ansichten löschen. Gibt es einen Befehl, der alle materialisierten Ansichten für Postgres auflistet oder alle löscht?

17
user1150989

Zeige alles:

SELECT oid::regclass::text
FROM   pg_class
WHERE  relkind = 'm';

Namen werden automatisch in doppelte Anführungszeichen gesetzt und bei Bedarf anhand Ihres aktuellen search_path in der Besetzung von regclass zu text schemaqualifiziert.

Im Systemkatalog pg_class sind materialisierte Ansichten mit relkind = 'm' gekennzeichnet.
Das Handbuch:

m = materialized view

Für drop all können Sie mit dieser Abfrage das benötigte SQL-Skript generieren:

SELECT 'DROP MATERIALIZED VIEW ' || string_agg(oid::regclass::text, ', ') 
FROM   pg_class
WHERE  relkind = 'm';

Kehrt zurück:

DROP MATERIALIZED VIEW mv1, some_schema_not_in_search_path.mv2, ...

Eine DROP MATERIALIZED VIEW Anweisung kann für mehrere materialisierte Ansichten sorgen. Möglicherweise müssen Sie am Ende CASCADE hinzufügen, wenn Sie verschachtelte Ansichten haben.

Überprüfen Sie das resultierende DDL-Skript, um sicherzugehen, bevor Sie es ausführen. Möchten Sie wirklich all MVs aus allen Schemas in der Datenbank löschen? Und haben Sie dazu die erforderlichen Berechtigungen? (Derzeit sind in einer neuen Standardinstallation keine materialisierten Ansichten vorhanden.)

37

Dies ist einfacher, wenn Sie eine vollständige Liste mit der DROP-Anweisung vor jeder Ansicht erhalten möchten:

SELECT 'DROP MATERIALIZED VIEW ' || relname || ';' 
FROM   pg_class
WHERE  relkind = 'm';
0
durbin510

Diese Antwort basiert auf der Antwort von Erwin Brandstetter . In der folgenden Version wird ein bestimmter Schemaname hinzugefügt, um nur die materialisierten Ansichten aus einem definierten Schema abzurufen. Das Cascasde löscht auch Abhängigkeiten von den materialisierten Ansichten aus diesem Schema. Sei vorsichtig damit.

SELECT 'DROP MATERIALIZED VIEW <<schema_name>>.' || c.relname::text || ' CASCADE;' AS drop_statements
FROM pg_class c
INNER JOIN pg_namespace n ON n.oid = c.relnamespace
AND c.relkind = 'm'
AND n.nspname = '<<schema_name>>'
0
Stefan