powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
16 сообщений из 16, страница 1 из 1
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574031
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.
Есть запрос который соединяет в едино данные из множества разных схем:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
WITH 
  "t1" AS (
     SELECT ....
     FROM "schema1".table
   ),
  "t2" AS (
     SELECT ....
     FROM "schema2".table
   ),
   ... еще более 20 таблиц ... 
SELECT * FROM "t1"
UNION ALL 
SELECT * FROM "t2"


И иногда случается так, что когда выполняется запрос, одна из схем еще не существует - ошибка типа
ERROR: schema "schema2" does not exist, после чего приходится вручную закомментировать все что относится к этой схеме, что очень неудобно

Могу ли я еще в WITH проверять есть ли схема или нет, и только если она существует выполнять запрос?
Я нашел вот такую конструкцию:
Код: plsql
1.
SELECT EXISTS(SELECT * FROM information_schema.tables WHERE table_schema = 'schema2')


Но как с ее помощью заставить ограничить выполнение подзапроса "t2" AS (...) так и не понял.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574055
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"не выбирать" не пробовали?
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574078
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoon"не выбирать" не пробовали?
Что именно Вы под этим подразумеваете?

При выполнении запроса первым делом выполняются подзапросы в разделе WITH, он проходится по всем поочередно и если натыкается на несуществующую схему, то выдает ошибку.
Как мне ему объяснить, что если "schema2" не существует, то пропусти этот подзапрос?
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574132
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KvasnikovHawkmoon"не выбирать" не пробовали?
Что именно Вы под этим подразумеваете?

При выполнении запроса первым делом выполняются подзапросы в разделе WITH, он проходится по всем поочередно и если натыкается на несуществующую схему, то выдает ошибку.
Как мне ему объяснить, что если "schema2" не существует, то пропусти этот подзапрос?

Никак (в запросе)
Писать свою хранимку вместо WITH запроса как костыль если уж очень надо
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574397
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim BogukПисать свою хранимку

Это сложно?
Может уже есть какой-нибудь шаблончик?
Честно говоря, даже не представляю по каким запросам в поиске искать.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574403
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kvasnikov, искать не надо, нужно читать: http://www.postgresql.org/docs/9.3/static/server-programming.html
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574479
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
используйте наследование, таблицы потомки в разных схемах с одинаковым именем допустимы при этом, только что проверил. и конструировать самостоятельно UNION запрос не понадобится вовсе.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38574514
Hawkmoon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KvasnikovHawkmoon"не выбирать" не пробовали?
Что именно Вы под этим подразумеваете?

При выполнении запроса первым делом выполняются подзапросы в разделе WITH, он проходится по всем поочередно и если натыкается на несуществующую схему, то выдает ошибку.
Как мне ему объяснить, что если "schema2" не существует, то пропусти этот подзапрос?

Была надежда (но не было времени проверить), что если не выбирать в секции union, то и к with-секции никогда обращения не будет.

По крайней мере, в других местах такое видел. Ну нет, так нет.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575072
FozzyBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hawkmoon,

ты можешь в
Код: sql
1.
select ... from "t2"


добавить условие
Код: sql
1.
where EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema2')



Получится типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH 
  "t1" AS (
     SELECT ....
     FROM "schema1".table
   ),
  "t2" AS (
     SELECT ....
     FROM "schema2".table
   ),
   ... 
SELECT * FROM "t1"
UNION ALL 
SELECT * FROM "t2" 
  WHERE EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema2').



Я так делал, работает. И к моему аналогу t2 обращения не происходило.
Использовал postgres 9.2, но наверняка и в других то же самое.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575104
FozzyBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Kvasnikov, извиняюсь, в предыдущем сообщении адресата перепутал.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575133
Kvasnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
FozzyBearты можешь добавить условие
Код: sql
1.
where EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema2')



У меня 9.1. К сожалению этот вариант не работает.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575198
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FozzyBearHawkmoon,

ты можешь в
Код: sql
1.
select ... from "t2"


добавить условие
Код: sql
1.
where EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema2')



Получится типа
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
WITH 
  "t1" AS (
     SELECT ....
     FROM "schema1".table
   ),
  "t2" AS (
     SELECT ....
     FROM "schema2".table
   ),
   ... 
SELECT * FROM "t1"
UNION ALL 
SELECT * FROM "t2" 
  WHERE EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema2').



Я так делал, работает. И к моему аналогу t2 обращения не происходило.
Использовал postgres 9.2, но наверняка и в других то же самое.

не должно работать...
но на этапе разбора запроса еще до выполнения оно выдаст ошибку что нет таблицы FROM "schema2".table
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575478
FozzyBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Boguk, я не проверял персонально со схемой, но конструкция работает.
Возможно наличие схемы движок проверит в любом случае, тогда да, развалится. Но что реальное обращение к t2 в этой конструкции произойдёт только если exists выполнен - факт.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575480
FozzyBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...и вычисление t2, естественно.
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38575801
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
FozzyBearMaxim Boguk, я не проверял персонально со схемой, но конструкция работает.
Возможно наличие схемы движок проверит в любом случае, тогда да, развалится. Но что реальное обращение к t2 в этой конструкции произойдёт только если exists выполнен - факт.

так задача то была именно проверка схемы перед тем как в нее лезть... а это не возможно так как это делается очень сильно раньше чем исполнение запроса...
про реальное обращение никто и не спорит...
...
Рейтинг: 0 / 0
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
    #38576488
FozzyBear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Maxim Bogukтак задача то была именно проверка схемы перед тем как в нее лезть... а это не возможно так как это делается очень сильно раньше чем исполнение запроса...
про реальное обращение никто и не спорит...
Для работы запроса при существующей/несуществующей схеме стоит запрос запихнуть в хранимую процедуру, которую и обновлять при создании схемы. И запрос всегда актуален, и на стороне клиента головной боли никакой.
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]