Как мне перебирать таблицы в базе данных Postgres, чтобы создать материализованные представления для всех несистемных таблиц?

Ниже приведен код, который я вручную создавал mviews, в котором переменными были бы table_schema, table_name и [список столбцов].

CREATE MATERIALIZED VIEW table_schema.table_name_bvw
AS
    WITH t0_ AS
        (SELECT [list of columns]
        FROM
            (SELECT  [list of columns] , Row_number() over (PARTITION BY objectid ORDER BY gdb_from_date DESC) rn_
            FROM     table_schema.table_name
            WHERE    (gdb_branch_id = 0)) a
WHERE rn_ = 1
AND gdb_is_delete = 0 )
    SELECT   [list of columns]
    FROM     t0_
WITH DATA;

CREATE UNIQUE INDEX IF NOT EXISTS table_name_bvw_uuid
    ON table_schema.table_name_bvw USING btree
    (globalid COLLATE pg_catalog."default" ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX IF NOT EXISTS table_name_bvw_spat_idx
    ON table_schema.table_name_bvw USING gist
    (shape)
    TABLESPACE pg_default;
    
ALTER TABLE IF EXISTS table_schema.table_name_bvw
    OWNER TO owner;

Я попытался создать цикл, но не знаю, как получить три переменные из базы данных. Должен ли я создать таблицу из этого и пройти через нее?

CREATE TABLE usa_master.fhltable as

SELECT table_catalog, table_schema, 
table_name, table_schema || '.' || table_name as tablen,
table_schema || '.' || table_name || '_bvw' as tablebvw,
table_name || '_bvw_uuid' as bud,
table_name || '_bvw_spat_idx' as bspat,
array_to_string(array_agg(column_name order by columns.ordinal_position),',') column_name
FROM information_schema.columns  
WHERE table_schema <> 'pg_catalog'   AND table_name NOT LIKE 'i%'
  AND table_schema = 'fhl'
  group by table_catalog,table_schema,table_name
 ;

Я также хочу, чтобы он пропустился, если mview уже существует.

Но почему? Зачем вам нужно создавать материализованное представление для каждой таблицы? Это похоже на неправильное решение для всего, что вы пытаетесь сделать. Может быть, считывающая копия вашей базы данных?

Jorge Campos 23.04.2024 18:09

Я не слышал о репликах читателей. Могу ли я применять запросы для создания представлений в указанной реплике?

Jeff Timm 23.04.2024 18:46

Но зачем вам создавать представления? Реплика - это синхронизированная копия вашей существующей базы данных, что означает, что все таблицы будут там, и если вы создадите ее только для чтения, никто не сможет ничего в ней изменить (без удаления/обновления/вставки), поэтому вам не нужно какое-либо представление. Решение, которое вы запрашиваете, выглядит как проблема XY прочитайте его и посмотрите, применимо ли оно к вам здесь.

Jorge Campos 23.04.2024 20:49
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну я понял! Передача параметров из таблицы в функцию Create и циклический просмотр всех записей. Отлично сработало.

    DO $$
DECLARE
    mviews CURSOR FOR
        SELECT tablebvw,column_name,tablen,bud,bspat FROM usa_master.fhltable;
    currentrow record;
BEGIN
    FOR currentrow in mviews
    LOOP
    EXECUTE
    'CREATE MATERIALIZED VIEW IF NOT EXISTS ' || currentrow.tablebvw || 
' AS
    WITH t0_ AS
        (SELECT  ' || currentrow.column_name || '
        FROM
            (SELECT ' || currentrow.column_name || ', Row_number() over (PARTITION BY objectid ORDER BY gdb_from_date DESC) rn_
            FROM ' || currentrow.tablen || '
            WHERE    (gdb_branch_id = 0)) a
WHERE rn_ = 1
AND gdb_is_delete = 0 )
    SELECT  ' || currentrow.column_name || '
    FROM     t0_
WITH DATA;

CREATE UNIQUE INDEX IF NOT EXISTS ' || currentrow.bud ||
    ' ON ' || currentrow.tablebvw ||' USING btree
    (globalid COLLATE pg_catalog."default" ASC NULLS LAST)
    TABLESPACE pg_default;

CREATE INDEX IF NOT EXISTS ' || currentrow.bspat || '
    ON ' || currentrow.tablebvw || ' USING gist
    (shape)
    TABLESPACE pg_default;
    
ALTER TABLE IF EXISTS ' || currentrow.tablebvw || '
    OWNER TO masterschema';
    END LOOP;
END$$;

Хитрость заключалась в использовании текущей строки в качестве источника переменной.

Другие вопросы по теме