PostgreSQL: как экспортировать определение функции в SQL - PullRequest
5 голосов
/ 20 января 2012

У меня есть функция (хранимая процедура), определенная в базе данных, которую я хотел бы отредактировать.

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

Возможно ли это сделать (выгрузить определение в файл SQL)?

То, что я делал в прошлом, этоиспользовать psql для подключения к базе данных, запустить функцию / df +, скопировать вывод в текстовый файл, помассировать текст так, чтобы он выглядел как объявление функции, но это отнимает много времени, и мне интересно, есть ли более изящный способделаю это.

Я использую PostgreSQL 9.1, если это имеет значение.

РЕДАКТИРОВАТЬ:

Я принял ответ Майка Буланда, потому что он дал правильный ответ в своем комментарии, который былзапустить \ ef функцию в psql.

Ответы [ 3 ]

5 голосов
/ 20 января 2012

Это фактически указано в предыдущем вопросе:

SELECT  proname, prosrc
FROM    pg_catalog.pg_namespace n
JOIN    pg_catalog.pg_proc p
ON      pronamespace = n.oid
WHERE   nspname = 'public';

Список сохраненных функций, которые ссылаются на таблицу в PostgreSQL

Вы должны быть в состоянии использовать это в командной строке или с клиентом, чтобы прочитать текущий текст процесса и делать с ним все, что вам захочется:)

Надеюсь, это поможет

2 голосов
/ 20 января 2012

Вам также понадобятся аргументы функции:

SELECT p.proname
     , pg_catalog.pg_get_function_arguments(p.oid) as params
     , p.prosrc
FROM   pg_catalog.pg_proc p
WHERE  oid = 'myschema.myfunc'::regproc;

Или, чтобы сделать его однозначным для функций с параметрами:

WHERE  oid = 'myschema.myfunc(text)'::regprocedure;

Или вы можете использовать pgAdmin делать то, что вы описываете намного комфортнее.Он отображает полный сценарий SQL для воссоздания объектов и имеет возможность автоматически скопировать его в окно редактирования.Отредактируйте и выполните.

1 голос
/ 20 января 2012

Я думаю, вам нужно сделать шаг назад и увидеть коренную проблему здесь.То есть вы не используете контроль версий для управления версиями ваших файлов (объектов базы данных).Есть много бесплатных, Git и Mercurial, чтобы назвать несколько.Поэтому используйте psql или запрос, предоставленный Майком, чтобы вывести структуру и поместить ее в систему управления версиями.В дальнейшем проверьте систему контроля версий и внесите в нее изменения.Вы должны развертывать код из этой системы контроля версий на сервере базы данных.Также полезно примирить, что код, который вы используете в управлении версиями, соответствует коду в базе данных автоматически и на регулярной основе.В теории, хотя, если существует строгий процесс, код, который не проверен в системе контроля версий, никогда не должен попадать в базу данных, и вам никогда не придется задумываться, соответствует ли система контроля версий тем, что имеет база данных.Однако я не верю, что люди с правами администратора не будут злоупотреблять своими привилегиями, поэтому я предпринял шаги, чтобы проверить это.Если обнаружено, что кто-то злоупотребляет своими привилегиями, с которыми можно разобраться другими способами.

...