Изменение схем просмотра источника во время выполнения - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть x уровней иерархии глубокого просмотра:

create view view1 as (select * from my_table);
create view view2 as (select * from view1);
create view view3 as (select * from view2);
create view view4 as (select * from view3);
...

Затем у меня есть запрос, который выбирает из последних viewX. Я хочу добавить фильтрацию к представлениям во время выполнения без изменения этого запроса. И эти фильтры должны быть только для текущего сеанса, поэтому я не хочу пересоздавать или изменять какие-либо представления.

Я попытался переопределить представления, для которых требуется фильтрация, с помощью одинаковых имен CTE / временных представлений / временных таблиц. Все это работает, если существует не более двух уровней иерархии:

create temp view view2 as (select * from view1 where some_condition = 1)

После этого (в том же сеансе) select * from view2 возвращает отфильтрованные результаты, как и ожидалось, поскольку вместо исходного используется временное представление. Но select * from view3 по-прежнему возвращает нефильтрованные результаты, потому что кажется, что он всегда использует public.view2 для внутреннего использования.

Есть ли способ определить представление, которое автоматически изменит его исходную схему во время выполнения между временной схемой и общедоступной схемой?

Другое решение, которое на самом деле сработало бы, - это создать функцию postgresql, которая принимает имя отношения источника в качестве параметра и возвращает результаты из временной схемы, если она найдена, или из общедоступной схемы. Но в идеале я хотел бы оставить текущие определения определений без изменений. Временные представления были бы идеальным и простым решением, если бы они работали с этими вложенными представлениями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...