Как запускать скрипты на каждой postgres схеме - PullRequest
0 голосов
/ 31 марта 2020

У меня есть сценарий оболочки, который перебирает папку и выполняет все сценарии sql из этой папки в данной базе данных. Ниже приведены параметры, которые я передаю этому сценарию

database.sh -h hostname -p port -U user -d database -P password

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

SELECT nspname 
FROM pg_catalog.pg_namespace 
WHERE nspname !~ '^pg_' 
AND nspname not in  ('information_schema','public');

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

1 Ответ

0 голосов
/ 31 марта 2020

Создайте список схем с помощью:

$ cat gls.sql
\pset tuples_only on
SELECT nspname 
FROM pg_catalog.pg_namespace 
WHERE nspname !~ '^pg_' 
AND nspname not in  ('information_schema','public');

Запустите ваши сценарии с помощью 2 SQL сценариев: первый изменяет search_path и вызывается вашим основным SQL сценарием, который работает на одиночная схема:

$ cat test.sql
\i set_current_schema.sql
show search_path;
select * from t;

Глобальный сценарий оболочки:

psql -f gls.sql -q -o ls.txt
for s in $(cat ls.txt)
do
 echo "set search_path='"$s"';" > set_current_schema.sql
 psql -e -f test.sql
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...