Запитайте визначення матеріалізованого виду в Postgres


21

Мені цікаво, як запитувати визначення матеріалізованого виду в Postgres. Для довідки, те, що я сподівався зробити, дуже схоже на те, що ви можете зробити для звичайного перегляду:

SELECT * FROM information_schema.views WHERE table_name = 'some_view';

що дає вам наступні стовпці:

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

Чи можливо це для матеріалізованих поглядів?

З мого дослідження поки що виходить, що матеріалізовані погляди свідомо виключаються з інформаційної схеми, тому що

Інформаційна схема може показувати лише об'єкти, які існують у стандарті SQL.

( http://www.postgresql.org/message-id/3794.1412980686@sss.pgh.pa.us )

Оскільки вони, як видається, повністю виключені з information_schema, я не знаю, як це зробити, але те, що я хотів би зробити, це подвійно:

  1. Запитайте, чи існує певний матеріалізований вигляд. (Поки єдиний спосіб, який я знайшов це зробити, - спробувати створити килимок з таким же ім'ям і побачити, чи він підірветься.)
  2. А потім запитуйте визначення матеріалізованого виду (аналогічно view_definitionстовпцю на information_schema.views).

Питання дещо пов'язане із запитом на унікальні обмеження на матеріалізовані погляди: dba.stackexchange.com/questions/101899
Шон Бін

Вас зацікавить швидкий спосіб перевірити екзистенцію: SELECT to_regclass('some_schema.some_mat_view')- якщо він знайдеться, він не повинен бути MV, хоча. Детальніше: stackoverflow.com/questions/20582500/…
Erwin Brandstetter

Відповіді:



13

Виявляється, це було не так складно, як я думав! (Маючи лише трохи знань про pg_catalog ...)

Частина 1: Запитайте, чи існує матеріалізований вигляд:

SELECT count(*) > 0
FROM pg_catalog.pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind = 'm'
AND n.nspname = 'some_schema'
AND c.relname = 'some_mat_view';

Приємно і легко.

Частина 2: Запитайте визначення матеріалізованого виду:

Для того, щоб створити запит, щоб отримати визначення матового виду, я спершу повинен був переглянути визначення information_schema.viewsпредставлення, виконавши:

SELECT view_definition
FROM information_schema.views
WHERE table_schema = 'information_schema'
AND table_name = 'views';

Тоді я переписав запит і змінений , c.relkind = 'v'::"char"щоб c.relkind = 'm'::"char"для того , щоб отримати посвідку на мат (замість звичайних поглядів). Повний запит див. Тут: http://pastebin.com/p60xwfes

У цей момент ви можете досить легко додати AND c.relname = 'some_mat_view'та запустити його, щоб отримати визначення some_mat_view.

Але вам все одно доведеться робити це заново наступного разу, коли захочете переглянути визначення матового виду ...

Бонус: Створіть подання, щоб зробити це простіше

Я вирішив створити новий погляд, щоб полегшити пошук визначень матового виду в майбутньому. Я в основному просто додав CREATE VIEW materialized_views ASдо початку запиту, пов'язаного вище, щоб створити новий вид, і тепер я можу його запитувати так:

SELECT *
FROM materialized_views
WHERE table_schema = 'some_schema'
AND table_name = 'some_mat_view';

Значно краще!

Я також можу використовувати цей погляд, щоб легко запитати, чи існує матеріалізований вигляд, змінивши *на count(*) > 0.

Відмова : Я не знаю цього, інші стовпці в результатах запиту є абсолютно правильними, оскільки матеріалізовані погляди принципово відрізняються від стандартних поглядів (я вважаю, що вони праві). Але це хоча б запит table_schema, table_nameі view_definitionправильно.


0

Недолік інших відповідей тут полягає в тому, що ви просто отримуєте визначення SQL, тоді як у більшості випадків вас цікавлять фактичні стовпці та вмієте маніпулювати ними як текстом. Далі є моя відповідь із аналогічного запитання , що включає назви стовпців та типи даних:

Я не можу сказати, що я повністю розумію основні моделі даних, тому використовуйте моє рішення нижче із зерном солі:

select 
    ns.nspname as schema_name, 
    cls.relname as table_name, 
    attr.attname as column_name,
    trim(leading '_' from tp.typname) as datatype
from pg_catalog.pg_attribute as attr
join pg_catalog.pg_class as cls on cls.oid = attr.attrelid
join pg_catalog.pg_namespace as ns on ns.oid = cls.relnamespace
join pg_catalog.pg_type as tp on tp.typelem = attr.atttypid
where 
    ns.nspname = 'your_schema' and
    cls.relname = 'your_materialized_view' and 
    not attr.attisdropped and 
    cast(tp.typanalyze as text) = 'array_typanalyze' and 
    attr.attnum > 0
order by 
    attr.attnum

Ви повинні змінити 'your_schema'і 'your_materialized_view'.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.