Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Проверка наличия схемы перед выполнением SELECT в подзапросе WITH / 16 сообщений из 16, страница 1 из 1
27.02.2014, 13:02:36
    #38574031
Kvasnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
Добрый день.
Есть запрос который соединяет в едино данные из множества разных схем:
Код: 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
27.02.2014, 13:12:20
    #38574055
Hawkmoon
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
"не выбирать" не пробовали?
...
Рейтинг: 0 / 0
27.02.2014, 13:22:19
    #38574078
Kvasnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
Hawkmoon"не выбирать" не пробовали?
Что именно Вы под этим подразумеваете?

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

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

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

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

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

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

По крайней мере, в других местах такое видел. Ну нет, так нет.
...
Рейтинг: 0 / 0
28.02.2014, 11:36:00
    #38575072
FozzyBear
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
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
28.02.2014, 12:03:35
    #38575104
FozzyBear
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
Kvasnikov, извиняюсь, в предыдущем сообщении адресата перепутал.
...
Рейтинг: 0 / 0
28.02.2014, 12:24:33
    #38575133
Kvasnikov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
FozzyBearты можешь добавить условие
Код: sql
1.
where EXISTS(SELECT 1 FROM information_schema.tables WHERE table_schema = 'schema2')



У меня 9.1. К сожалению этот вариант не работает.
...
Рейтинг: 0 / 0
28.02.2014, 13:01:18
    #38575198
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
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
28.02.2014, 16:31:08
    #38575478
FozzyBear
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
Maxim Boguk, я не проверял персонально со схемой, но конструкция работает.
Возможно наличие схемы движок проверит в любом случае, тогда да, развалится. Но что реальное обращение к t2 в этой конструкции произойдёт только если exists выполнен - факт.
...
Рейтинг: 0 / 0
28.02.2014, 16:32:10
    #38575480
FozzyBear
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
...и вычисление t2, естественно.
...
Рейтинг: 0 / 0
01.03.2014, 00:38:56
    #38575801
Maxim Boguk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Проверка наличия схемы перед выполнением SELECT в подзапросе WITH
FozzyBearMaxim Boguk, я не проверял персонально со схемой, но конструкция работает.
Возможно наличие схемы движок проверит в любом случае, тогда да, развалится. Но что реальное обращение к t2 в этой конструкции произойдёт только если exists выполнен - факт.

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


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