Ниже приведен код, который я вручную создавал 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 уже существует.
Я не слышал о репликах читателей. Могу ли я применять запросы для создания представлений в указанной реплике?
Но зачем вам создавать представления? Реплика - это синхронизированная копия вашей существующей базы данных, что означает, что все таблицы будут там, и если вы создадите ее только для чтения, никто не сможет ничего в ней изменить (без удаления/обновления/вставки), поэтому вам не нужно какое-либо представление. Решение, которое вы запрашиваете, выглядит как проблема XY прочитайте его и посмотрите, применимо ли оно к вам здесь.
Ну я понял! Передача параметров из таблицы в функцию 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$$;
Хитрость заключалась в использовании текущей строки в качестве источника переменной.
Но почему? Зачем вам нужно создавать материализованное представление для каждой таблицы? Это похоже на неправильное решение для всего, что вы пытаетесь сделать. Может быть, считывающая копия вашей базы данных?