Zastanawiam się, jak zapytać o definicję zmaterializowanego widoku w Postgres. Dla porównania, to, co miałem nadzieję zrobić, jest bardzo podobne do tego, co możesz zrobić dla zwykłego widoku:
SELECT * FROM information_schema.views WHERE table_name = 'some_view';
co daje następujące kolumny:
table_catalog
table_schema
table_name
view_definition
check_option
is_updatable
is_insertable_into
is_trigger_updatable
is_trigger_deletable
is_trigger_insertable_into
Czy jest to możliwe w przypadku zmaterializowanych widoków?
Z moich dotychczasowych badań wynika, że zmaterializowane poglądy są celowo wyłączone z schematu_informacji, ponieważ
Information_schema może pokazywać tylko obiekty istniejące w standardzie SQL.
( http://www.postgresql.org/message-id/[email protected] )
Ponieważ wydaje się, że są całkowicie wykluczeni ze schematu_informacyjnego, nie jestem pewien, jak to zrobić, ale chciałbym zrobić to podwójnie:
- Zapytanie, czy istnieje konkretny zmaterializowany widok. (Do tej pory jedynym sposobem, w jaki to zrobiłem, jest utworzenie widoku mat o tej samej nazwie i sprawdzenie, czy się wysadza).
- Następnie zapytaj o definicję zmaterializowanego widoku (podobnie jak w
view_definition
kolumnie nainformation_schema.views
).
postgresql
materialized-view
postgresql-9.4
information-schema
Sean the Bean
źródło
źródło
SELECT to_regclass('some_schema.some_mat_view')
- jeśli zostanie znaleziony, nie musi to być jednak MV. Szczegóły: stackoverflow.com/questions/20582500/…Odpowiedzi:
Wygląda na 9.3 i więcej, możesz zrobić:
Więcej informacji można znaleźć tutaj: /programming/29297296/postgres-see-query-used-to-create-materialized-view
źródło
Okazuje się, że to nie było tak skomplikowane, jak myślałem! (Przy odrobinie wiedzy na temat pg_catalog ...)
Część 1: Pytanie, czy istnieje widok zmaterializowany:
Miło i łatwo.
Część 2: Zapytanie o definicję zmaterializowanego widoku:
Aby znaleźć zapytanie o definicję widoku maty, najpierw musiałem sprawdzić definicję
information_schema.views
widoku, uruchamiając:Następnie skopiowałem zapytanie i zmieniłem
c.relkind = 'v'::"char"
nac.relkind = 'm'::"char"
, aby uzyskać widoki mat (zamiast zwykłych). Zobacz pełne zapytanie tutaj: http://pastebin.com/p60xwfesW tym momencie można dość łatwo dodać
AND c.relname = 'some_mat_view'
i uruchomić, aby uzyskać definicjęsome_mat_view
.Ale nadal będziesz musiał to zrobić od nowa, kiedy będziesz chciał sprawdzić definicję widoku maty ...
Premia: Utwórz widok, aby to ułatwić
Zdecydowałem się utworzyć nowy widok, aby ułatwić wyszukiwanie definicji mat w przyszłości. Zasadniczo właśnie dodałem
CREATE VIEW materialized_views AS
na początku powyższego zapytania, aby utworzyć nowy widok, a teraz mogę go zapytać w następujący sposób:Dużo lepiej!
Mogę również użyć tego widoku, aby łatwo zapytać, czy istnieje widok zmaterializowany, zmieniając
*
nacount(*) > 0
.Oświadczenie : nie wiem, czy inne kolumny w wynikach zapytania są całkowicie poprawne, ponieważ zmaterializowane widoki zasadniczo różnią się od standardowych widoków ( myślę , że mają rację). Ale robi to przynajmniej kwerendy
table_schema
,table_name
iview_definition
słusznie.źródło
Wadą pozostałych odpowiedzi jest to, że po prostu dostajesz definicję SQL, podczas gdy w większości przypadków interesują Cię rzeczywiste kolumny i możesz nimi manipulować jako tekst. Oto moja odpowiedź na podobne pytanie , które obejmuje nazwy kolumn i typy danych:
Nie mogę powiedzieć, że w pełni rozumiem podstawowy model danych, więc użyj mojego rozwiązania poniżej z odrobiną soli:
Musisz się zmienić
'your_schema'
i'your_materialized_view'
.źródło