Задать вопрос
@BaJIepaMoTo6JIok

Как поменять значения во всех таблицах postgresql?

Столкнулся с проблемой при обновлении постгреса с 10 до 14 через pg_upgrade.
Your installation contains tables declared WITH OIDS

Он в файлик вывел список таблиц в различных базах. Как можно выполнить команду ALTER TABLE ... SET WITHOUT OID сразу в нескольких таблицах в разных базах?
  • Вопрос задан
  • 135 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
@BaJIepaMoTo6JIok Автор вопроса
В общем решение такое. В каждой бд прогоняется данный скрипт
SELECT 'ALTER TABLE "' || n.nspname || '"."' || c.relname || '" SET WITHOUT OIDS;'
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE 1=1
  AND c.relkind = 'r'
  AND c.relhasoids = true
  AND n.nspname <> 'pg_catalog' 
order by n.nspname, c.relname;

результатом выполнения которого будет пачка запросов в выводе, которые просто можно целиком скопировать и прогнать
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
AshBlade
@AshBlade
Просто хочу быть счастливым
Нашел ответ тут - https://fraserclark.net/2023-10-06-rds-oids/
Вот скрипт, который он предложил:
#!/bin/bash

# I found without setting this the script would fail
export PGPASSWORD=xxxx

# Define your query
QUERY="SELECT current_database(),n.nspname ,c.relname, c.relkind from pg_class c, pg_attribute a, pg_namespace n where c.oid = a.attrelid and a.attname = 'oid' AND c.relnamespace = n.oid AND n.nspname NOT IN ('pg_catalog', 'information_schema') and c.relkind = 'r';"

# Get a list of all databases in the RDS cluster
DATABASES=$(psql -h hostname.eu-west-2.rds.amazonaws.com -p 5432 -U postgres -c "SELECT datname FROM pg_database WHERE datname NOT IN ('template0', 'template1');" -t)

# Loop through each database and execute the query
for DB in $DATABASES; do
    echo "Running query on database: $DB"
    psql -h qa-hostname.eu-west-2.rds.amazonaws.com -t -c "$QUERY" -U postgres -d $DB
done
Ответ написан
ky0
@ky0
Миллиардер, филантроп, патологический лгун
Поскольку это операция разовая - просто возьмите список таблиц и выполните в цикле ALTER TABLE.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы