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

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

Я также пытался:

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

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

1 Ответ

0 голосов
/ 28 января 2020

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

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

  1. выкинуть все это и потом разобраться. Мне не очень нравится эта идея, потому что вам нужно go из-за проблем написания сценариев вокруг начала / конца различных операторов 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
...