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

Как можно одновременно выполнить команду ALTER TABLE ... SET WITHOUT OIDS для нескольких таблиц в разных базах, если обновление PostgreSQL с 10 до 14 через pg_upgrade вывело сообщение "Your installation contains tables declared WITH OIDS"?
  • 21 января 2024 г. 12:47
Ответы на вопрос 3
Для выполнения операции `ALTER TABLE ... SET WITHOUT OIDS` в PostgreSQL для всех таблиц, вам потребуется написать скрипт, который создает и выполняет соответствующие команды для каждой таблицы. В PostgreSQL для этого можно использовать динамический SQL в PL/pgSQL, например, так:

```sql
DO $$
DECLARE
    r RECORD;
BEGIN
    FOR r IN
        SELECT table_schema, table_name
        FROM information_schema.tables
        WHERE table_schema NOT IN ('pg_catalog', 'information_schema')
          AND table_type = 'BASE TABLE'
    LOOP
        EXECUTE format('ALTER TABLE %I.%I SET WITHOUT OIDS', r.table_schema, r.table_name);
    END LOOP;
END $$;
```

Этот анонимный блок кода перебирает все пользовательские таблицы в текущей базе данных и выполняет команду `ALTER TABLE` для установки `WITHOUT OIDS`.

Если вам необходимо выполнить это в нескольких базах данных, вам придется выполнять этот скрипт, подключаясь к каждой базе данных поочередно. Это можно сделать с помощью утилиты командной строки `psql`:

```bash
for db in db1 db2 db3; do
    psql -d "$db" -c "DO $$ /* вставьте скрипт выше */ $$;"
done
```

Для автоматического перечисления всех баз данных можно использовать такой скрипт:

```bash
PSQL="psql -X -A -t"
SQL="SELECT datname FROM pg_database WHERE datistemplate = false AND datallowconn = true AND datname NOT IN ('postgres', 'template0', 'template1');"
DBNAMES=$(psql -X -A -t -c "$SQL")

for db in $DBNAMES; do
    $PSQL -d "$db" -c "DO $$ /* вставьте скрипт выше */ $$;"
done
```

Обратите внимание, что операции изменения структуры базы данных могут быть рискованными и потенциально могут привести к потере данных, особенно когда дело касается системных атрибутов, таких как OIDs. Перед их выполнением настоятельно рекомендуется сделать полную резервную копию баз данных.

После изменения структуры таблиц вы также можете запустить `pg_upgrade` снова, чтобы завершить процесс обновления.
Нашел ответ тут - https://fraserclark.net/2023-10-06-rds-oids/ 
Вот скрипт, который он предложил:
Поскольку это операция разовая - просто возьмите список таблиц и выполните в цикле ALTER TABLE.
Похожие вопросы