как узнать DDL какого либо объекта (функции, триггера)

Иван Владимирович
Дата: 17.03.2004 15:49:34
Подскажите каким образом узнать DDL объекта в PostgreSQL ?
version 7.2
Shweik
Дата: 17.03.2004 19:39:13
Все описания DDL можно получить при помощи оператора SELECT
Имена системных таблиц по умолчанию начинаются с pg_
Например В psql есть комманда \df+
Она выполняет вот такой запрос:
SELECT CASE WHEN p.proretset THEN 'setof ' ELSE '' END ||
pg_catalog.format_type(p.prorettype, NULL) as "Тип данных результата",
n.nspname as "Схема",
p.proname as "Имя",
pg_catalog.oidvectortypes(p.proargtypes) as "Типы данных аргументов",
u.usename as "Владелец",
l.lanname as "Язык",
p.prosrc as "Исходный текст",
pg_catalog.obj_description(p.oid, 'pg_proc') as "Описание"
FROM pg_catalog.pg_proc p
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = p.pronamespace
LEFT JOIN pg_catalog.pg_language l ON l.oid = p.prolang
LEFT JOIN pg_catalog.pg_user u ON u.usesysid = p.proowner
WHERE p.prorettype <> 'pg_catalog.cstring'::pg_catalog.regtype
AND p.proargtypes[0] <> 'pg_catalog.cstring'::pg_catalog.regtype
AND NOT p.proisagg
AND pg_catalog.pg_function_is_visible(p.oid)
ORDER BY 2, 3, 1, 4;
Аналогично можно получить свойства и DDL практически любого объекта.
Иван Владимирович
Дата: 18.03.2004 08:01:13
отлично, так я могу увидеть DDL функций, а есть возможность посмотреть DDL триггера?
Shweik
Дата: 18.03.2004 22:37:27
Не помню - специально в предыддущем посте я писал про таблицы pg_* В них все описано есть,
А что где конкретно -RTFM.
Shweik
Дата: 19.03.2004 15:35:38
С утра просматривал старые скрипты в мусорнике и вот чего вспомнил:
--Имя и определение тригеров для данной таблицы
--Дамп комманды "\d mytiblya"
SELECT t.tgname, pg_catalog.pg_get_triggerdef(t.oid)
FROM pg_catalog.pg_trigger t
WHERE t.tgrelid = (SELECT c.oid FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE pg_catalog.pg_table_is_visible(c.oid)
AND c.relname ~ '^mytiblya$')
AND (not tgisconstraint OR NOT EXISTS (SELECT 1 FROM
pg_catalog.pg_depend d JOIN pg_catalog.pg_constraint c ON (d.refclassid =
c.tableoid AND d.refobjid = c.oid) WHERE d.classid = t.tableoid
AND d.objid = t.oid AND d.deptype = 'i' AND c.contype = 'f'));
Опятть таки скажу - все это есть в коде psql!
RTFM и да пребудет с вами Шворц!
yurchello
Дата: 21.03.2004 15:43:44
А не проще pgAdmin (под иксы есть, и под винды) ???
он даёт DDL всех объектов в базе.
Иван Владимирович
Дата: 22.03.2004 13:35:49
пытаюсь выполнить предложенный запрос, вылетает ошибка

parser: parse error at or near "("
подскажите в чём причина?
mordoor
Дата: 22.03.2004 21:23:45

А не проще pgAdmin (под иксы есть, и под винды) ???
он даёт DDL всех объектов в базе.

Гы! А IMHO проще в psql набрать \d имя_таблицы и прочитать
описание триггеров. Вроде по-русски писал: --Дамп комманды "\d mytiblya"
Ну а "\df" вывалит описание всех функций в данной базе
А из программы я делаю что-то вроде
select proname,prosrc from pg_proc;
И вообще раз увас стоит какой-то древний и заведомо не локализированный Постгрес - вот вам кусочек вывода команнды \?
(только учтите что это все относится к PG 7.4 - могут мыть мелкие отличия-
впрочем все эти хваленые PGAdminы тоже соскрипом работают с разными версиями постгреса 8=) )
И лично я советовал бы подумать об обновлении. 7.2 -отнюдь не
настолько стабильна чтобы за нее цепляться.
Список комманд psql :

Общие
\c[onnect] [ИМЯБД|- [ПОЛЬЗОВАТЕЛЬ]]
подсоединиться к новой базе данных (текущая: "mdb")
\cd [ДИР] поменять текущую рабочую директорию
\copyright показать условия пользования и распространения PostgreSQL
\encoding [КОДИРОВКА]
показать или установить кодировку клиента
\h [ИМЯ] подсказка по синтаксису SQL команд; * для всех команд
\q выйти из psql
\set [ИМЯ [ЗНАЧЕНИЕ]]
установить внутреннюю переменную или показать все если нет параметров
\timing переключить режим замера запросов (в данный момент: выкл.)
\unset ИМЯ удалить внутреннюю переменную
\! [КОМАНДА] выполнить команду в оболочке или запустить интерактивную оболочку

Буфер запросов
\e [ФАЙЛ] редактировать текущий буфер запросов (или файл) с помощью внешнего редактора
\g [ФАЙЛ] отправить буфер запросов серверу (и записать результаты в файл или |канал)
\p показать содержимое буфера запросов
\r отчистить буфер запросов
\s [ФАЙЛ] показать историю или сохранить её в файл
\w [ФАЙЛ] записать текущий буфер запросов в файл

Ввод/Вывод
\echo [СТРОКА] печатать строку в стандартный вывод
\i ФАЙЛ выполнить команды из файла
\o ФАЙЛ отправить все результаты запросов в файл или |канал
\qecho [СТРОКА]
печатать текст в поток вывода запроса (см. \o)

Информационные
\d [ИМЯ] описать таблицу, индекс, последовательность или вид
\d{t|i|s|v|S} [ПАТТЕРН] (добавьте "+" для более детальной информации)
показать таблицы/индексы/последовательности/виды/системные таблицы
\da [ПАТТЕРН] показать агрегатные функции
\dc [ПАТТЕРН] показать конверсии
\dC показать конверсии типов
\dd [ПАТТЕРН] показать коментарий для объекта
\dD [ПАТТЕРН] показать домены
\df [ПАТТЕРН] показать функции (добавьте "+" для более детальной информации)
\dn [ПАТТЕРН] показать схемы
\do [ИМЯ] показать операторы
\dl показать большие объекты, аналог \lo_list
\dp [ПАТТЕРН] показать привилегии доступа таблиц
\dT [ПАТТЕРН] показать типы данных (добавьте "+" для более детальной информации)
\du [ПАТТЕРН] показать пользователей
\l показать все базы данных (добавьте "+" для более детальной информации)
\z [ПАТТЕРН] показать привилегии доступа таблиц (аналог \dp)

Форматирование
\a переключиться между неформатированным и форматированным выводом
\C [СТРОКА] установить заголовок таблицы или убрать если строка пуста
\f [СТРОКА] показать или установить разделитель полей для неформатированного вывода
\H переключиться в режим вывода в формате HTML (текущий формат: выкл.)
\pset ИМЯ [ЗНАЧЕНИЕ]
установить опцию вывода таблиц
(ИМЯ := {format|border|expanded|fieldsep|footer|null|
recordsep|tuples_only|title|tableattr|pager})
\t показывать только строки (в данный момент: выкл.)
\T [СТРОКА] установить атрибуты HTML-тага <table>, или удалить если строка пуста
\x переключится в расширенный режим вывода (текущий: выкл.)

Copy, Большие объекты
\copy ... выполнить SQL COPY с потоком данных к хосту клиента
\lo_export
\lo_import
\lo_list
\lo_unlink операции над большими объектами