Ответ 1
использовать pg_getfunctiondef
; см. системные информационные функции. pg_getfunctiondef
был добавлен в PostgreSQL 8.4.
SELECT pg_get_functiondef('proc_name'::regproc);
Чтобы сбросить все функции в схеме, вы можете запросить системные таблицы в pg_catalog
; скажем, если вы хотите все от public
:
SELECT pg_get_functiondef(f.oid)
FROM pg_catalog.pg_proc f
INNER JOIN pg_catalog.pg_namespace n ON (f.pronamespace = n.oid)
WHERE n.nspname = 'public';
тривиально изменить выше сказанное, чтобы сказать "из всех схем, кроме тех, которые начинаются с pg_
", вместо этого, если вы хотите.
В psql
вы можете отправить это в файл с помощью:
psql -At dbname > /path/to/output/file.sql <<"__END__"
... the above SQL ...
__END__
Чтобы запустить вывод в другом БД, используйте что-то вроде:
psql -1 -v ON_ERROR_STOP -f /path/to/output/file.sql target_db_name
Если вы реплицируете функции между такими DB, рассмотрите возможность хранения авторской копии определений функций как SQL script в системе управления версиями, такой как svn или git, желательно упакованной как расширение PostgreSQL. См. расширения для упаковки.