pg_dump
, пожалуй, лучший вариант здесь, так как это инструмент экспорта, который поставляется в комплекте с Postgres и предназначен для (более или менее) именно этого. Единственный улов с указанным вами требованием состоит в том, что он специально запрашивает определенные типы объектов (что, я предполагаю, является строгим требованием).
pg_dump
имеет флаг -s (--schema-only)
, который будет создайте дамп всех операторов create
для всех объектов (не только таблиц и триггеров). Поэтому я думаю, что есть 2 варианта:
- выкинуть все это и потом разобраться. Мне не очень нравится эта идея, потому что вам нужно go из-за проблем написания сценариев вокруг начала / конца различных операторов SQL, чтобы выбрать только то, что нужно удалить. Слишком грязно.
- написать сценарий, который включает
pg_dump
и предварительно выбирает только триггеры и таблицы . Сценарий должен использовать psql
для запроса системных таблиц Postgres и получения имен всех объектов table
и trigger
. Затем введите этот список в pg_dump
, чтобы экспортировать каждый объект отдельно.
Вариант 2 звучит намного проще, но также и медленнее, так как я думаю, что триггеры, возможно, должны быть выполнены один за другим (таблицы могут быть выполнены оптом, используя опцию -t (--table=TABLE)
для pg_dump
). Но так как это только дамп объектов схемы и никаких данных, это, вероятно, не будет иметь большого значения.
Вы можете выбрать триггеры следующим образом:
pg_dump -s -Fc | pg_restore --trigger='my_trigger'
И это можно заключить в скрипт:
#!/bin/bash
my_db='db_name'
triggers=($(psql --dbname="${my_db}" -A -R ', ' -t \
-c 'select tgname from pg_trigger'))
for trigger in "${triggers[@]}"; do
pg_dump -s -Fc | pg_restore --trigger="$trigger"
done