2013-12-10 2 views
1

Мне нужен доступ к . Исходный код объектов для автоматизации определенных задач. Например: полный источник представления - это сам вид, его правила, триггеры, привилегии ...Исходный объект-источник программно

Используя различные инструменты PostgreSQL, такие как PgAdmin, pg_dump, psql, это можно легко извлечь, но мне нужно иметь возможность доступ к нему через вызов функции (sql/plpgsql).

Непросто реализовать API, выглядящий так: getFunctionSource, getTableSource, getFUnctionSource. Тем не менее, похоже, что этот код потребует много обслуживания в разных версиях базы данных.

Есть ли официально или хорошо протестировано расширение, API, обертка pg_dump или что-то еще, что я могу использовать?

+0

@Denis Я уже пытаюсь. Но вместо того, чтобы делать это с нуля, возможно, есть другие усилия с открытым исходным кодом, в которые я могу внести свой вклад. Вносить свой вклад в вашу логику: «не сложно» - это не то же самое, что «легко». Спасибо за ваш вклад. – Milos

ответ

1

Если вы запустите psql -E, вы увидите скрытые запросы, которые получат Postgres для вывода определений данных.

сырье источника функции, в, например, можно найти, запустив \df foo, чтение запроса, а затем пытается:

select prosrc from pg_proc where proname = 'foo' 

\sf foo не дают соответствующие функции, используя этот подход, но беглый заглядывать в docs on system information functions (которых много) следует предположить, что это просто обертка:

select pg_get_functiondef('foo'::regproc); 

Несколько просмотров, чтобы вы начали, если вы идете маршрут размещения своих вещей на GitHub:

https://gist.github.com/ddebernardy/7893922

(Вы хотите создать «систему» ​​схему перед запуском файла с помощью \ я в PSQL.)

+0

Хороший пример. выберите pg_get_functiondef ('foo' :: regproc); вернет определение функции, но не «изменить владельца набора функций» и установить привилегии. Если вы выполните «pg_dump --schema-only -t foo yourdb», вы получите ** полный ** источник. Когда я говорю «complete», я имею в виду, что когда вы бросаете объект и выполняете его источник, весь источник db остается неизменным. – Milos

+0

Ya. И если вы запустите '\ df + foo' после запуска' psql -E', вы увидите, что владелец появился вместе с запросом, который вам нужен, чтобы получить его ... Системный каталог и функции системной информации являются «официально поддерживаемыми или проверенными», способ сделать это: как это делает psql; и как это работает pg_dump; и как это делает PGAdmin; и как это делает [Доктрина] (http://www.doctrine-project.org); и ... –

+0

Можете ли вы использовать \ df + foo в коде plpgsql? Например, можете ли вы создать функцию plpgsql, которая просматривает все представления в базе данных и объединяет их и возвращает их как текст? Насколько я помню, \ df и другие - мета-команды psql. О, и я уже знаю, как «получить код, который получает код» вручную. Это НЕ то, что мне нужно. – Milos

Смежные вопросы