Автоматический способ преобразования базы данных postgresql в схему postgresql в другой базе данных?

Существует ли автоматизированный способ взять базу данных postgresql и преобразовать ее в схему postgresql, которую можно загрузить в новую базу данных?

Я поиграл с этим и нашел два способа сделать то, что я хочу сделать, но, по моему честному мнению, оба хлопотны:

  1. Выполните pg_dump в базе данных, используя опцию plain, как часть скрипта, а затем запустив дурацкую работу с sed, чтобы внести соответствующие изменения. Однако это напрашивается на боль и баги.

  2. Перенесите все таблицы, последовательности, данные и т. д. из схемы базы данных в новое имя схемы через psql, а затем выгрузите/восстановите только эту схему/данные.

Я, вероятно, выберу второй вариант, но есть ли у кого-нибудь более простой способ сделать это? если бы мы генерировали материал с нуля, это, конечно, было бы тривиально, но, вероятно, нам придется таким образом переносить существующие базы данных на несколько систем.

EDIT: Пояснение для тех, кто будет читать это позже. Я пытаюсь по существу взять общедоступную схему базы данных «A» и сбросить/восстановить ее в новую именованную схему в базе данных «B». База данных «B» может использовать или не использовать свою общедоступную схему для других целей, поэтому передача должна выполняться БЕЗ изменения/изменения каких-либо потенциальных данных в общедоступной схеме в базе данных «B».


person K.Niemczyk    schedule 29.10.2013    source источник


Ответы (1)


Поскольку у вас не может быть вложенных схем, я предполагаю, что вы хотите взять общедоступную схему в базе данных A и поместить ее в именованную схему в базе данных B.

Вот простой способ сделать это (может потребоваться некоторое усилие в отношении search_path, чтобы все было найдено правильно, особенно в отношении функций, но см. примечания ниже.

  1. Сбросьте свою БД из БД А. Восстановите ее в БД Б

  2. Выполните следующую команду на базе данных B:

    ALTER SCHEMA public RENAME TO foobar;
    
  3. Затем вы можете изменить некоторых пользователей, чтобы они сначала искали отношения и функции в foobar:

    ALTER USER myuser SET search_path=foobar,public;
    
  4. Если у вас есть функции, вы можете:

    ALTER FUNCTION foo(bar int) SET search_path=foobar;
    

Я думаю, что это охватывает основы.

Теперь, если вы не можете быть уверены, что общедоступная схема используется, вы можете проконсультироваться с pg_class и pg_namespace, чтобы попытаться определить, какая схема задействована. Вы можете сделать это, проверив пространства имен определенных таблиц и постаравшись убедиться, что задействована только одна схема. Если одно и то же имя таблицы встречается в нескольких схемах и является той, которую вы используете для обнаружения, вам потребуется вручную вмешаться.

person Chris Travers    schedule 30.10.2013
comment
А теперь самое интересное. База данных, которую я собираюсь восстановить, может использовать или не использовать общедоступную схему. Таким образом, я бы очень нервничал, переименовывая его после восстановления, так как я считаю, что могу непреднамеренно привести к тому, что другие потеряют доступ к своим данным. Я обновил вопрос, чтобы отразить этот момент. Спасибо. - person K.Niemczyk; 30.10.2013
comment
Я добавил некоторую информацию о том, как решить эту проблему. Однако в какой-то момент вам придется указать, в каких случаях вам нужно просить ручного вмешательства. - person Chris Travers; 31.10.2013