Подтвердить что ты не робот

Получить определение функции, последовательности, типа и т.д. В Postgresql с SQL-запросом

Мне нужны сценарии создания для объектов базы данных PostgreSQL.

У меня нет доступа к pg_dump. Поэтому мне нужно получить все с SQL-запросами. Как я могу это сделать?

4b9b3361

Ответ 1

Чтобы получить определение функции, используйте pg_get_functiondef():

select pg_get_functiondef(oid)
from pg_proc
where proname = 'foo';

Существуют аналогичные функции для получения определения индекса, вида, правила и т.д. Подробнее см. В руководстве: http://www.postgresql.org/docs/current/static/functions-info.html

Получение определения типа пользователя несколько сложнее. Для этого вам нужно запросить information_schema.attributes:

select attribute_name, data_type
from information_schema.attributes
where udt_schema = 'public'
  and udt_name = 'footype'
order by ordinal_postion;

Из этого вам нужно снова собрать инструкцию create type.

Для получения дополнительной информации вам нужно будет ознакомиться с документацией по системному каталогу: http://www.postgresql.org/docs/current/static/catalogs.html

Но вы должны предпочесть представления information_schema, если они возвращают ту же информацию.

Ответ 2

Вы найдете psql -E инструмент в ваших поисках этих запросов.
Он отображает запросы psql, используемые при выполнении своих команд обратной косой черты - например, \df+ myfunc для получения подробной информации об этой функции.

Ответ 3

Вот полный примерный запрос с использованием pg_get_functiondef:

WITH funcs AS (
  SELECT
    n.nspname AS schema
    ,proname AS sproc_name
    ,proargnames AS arg_names
    ,t.typname AS return_type
    ,d.description
    ,pg_get_functiondef(p.oid) as definition
  FROM pg_proc p
    JOIN pg_type t on p.prorettype = t.oid
    JOIN pg_description d on p.oid = d.objoid
    JOIN pg_namespace n on n.oid = p.pronamespace
  WHERE n.nspname = 'some_schema_name_here'
)
SELECT *
FROM funcs
;;

Обратите внимание, что вы должны явно указать имя схемы (или "public", если вы используете эту схему)