Как сгенерировать скрипты для всех триггеров и таблиц в базе данных с помощью pgAdmin4

Я хотел бы создать сценарий SQL, содержащий SQL для создания всех триггеров и таблиц, существующих в нашей базе данных. Я уже пробовал метод, когда вы щелкаете правой кнопкой мыши по таблице, выбираете script -> create Scripts. Хотя это создает сценарий SQL для таблицы, он не создает сценарий для триггерных функций этой таблицы. Что я должен делать?

Я также пробовал:

SELECT tgrelid::regclass
     , tgname
     , pg_get_triggerdef(oid)
     , pg_get_functiondef(tgfoid)
FROM   pg_trigger
WHERE  tgrelid = 'public.tablename'::regclass;

но это бесполезно, потому что создает файл CSV.


person sargol    schedule 27.01.2020    source источник
comment
Не имеет отношения к вашему вопросу, но: Postgres 9.2 больше не поддерживается, вам следует планировать обновление как как можно скорее.   -  person a_horse_with_no_name    schedule 28.01.2020
comment
Вы уже рассмотрели pg_dump (возможно, с опцией -s, если вам не нужны данные)? документы 9.6 здесь   -  person wobr    schedule 28.01.2020


Ответы (1)


pg_dump, вероятно, лучший вариант, так как это инструмент экспорта, который поставляется в комплекте с Postgres и предназначен (более или менее) именно для этого. Единственная загвоздка в указанном вами требовании заключается в том, что оно специально запрашивает определенные типы объектов (что, как я предполагаю, является строгим требованием).

pg_dump имеет флаг -s (--schema-only), который выводит все операторы create для всех объектов (а не только для таблиц и триггеров). Так что думаю есть 2 варианта:

  1. выгрузить все это, а затем отсортировать. Мне не очень нравится эта идея, потому что вам придется столкнуться с проблемой написания сценариев для начала/конца всех видов различных SQL-операторов в чтобы выбрать только то, что нужно удалить. Слишком грязный.
  2. напишите скрипт, который обертывает 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
person Z4-tier    schedule 28.01.2020
comment
Большое спасибо за ваш терпеливый ответ. Поскольку я новичок в SQL, у меня есть некоторые проблемы. Не могли бы вы точно описать для меня, есть ли у меня таблица с именем: A, и у нее есть два триггера с именами B и C, а таблица A связана с другой таблицей с внешними ключами. как мне написать приведенный выше код? - person sargol; 28.01.2020
comment
В случае, который вы описали, тот же подход все равно будет работать. Сначала вы должны запустить pg_dump для таблицы: pg_dump -d 'my_db' -h 'db_hostname' -U 'db_user' -T 'A', а затем использовать ту же концепцию, что и скрипт, для дампа триггеров: pg_dump -s -Fc | pg_restore --trigger='B' и pg_dump -s -Fc | pg_restore --trigger='C'. - person Z4-tier; 28.01.2020
comment
pg_dump и pg_restore — это инструменты командной строки, поставляемые с Postgres. Я не думаю, что вы можете запустить их с помощью pgAdmin. Вам нужно запустить их в терминале. - person Z4-tier; 28.01.2020
comment
Спасибо большое попробую так - person sargol; 28.01.2020