Зависимости функций, используемых триггерами? - PullRequest
1 голос
/ 14 февраля 2011

У меня есть база данных Postgres, в которой хранится вся информация, собранная нашей системой, а затем схема воспроизведения, которая содержит небольшую часть таблиц, содержащихся в общедоступной схеме. Эта схема воспроизведения создается с использованием автоматического сценария, которому дается несколько необходимых представлений / таблиц в схеме, а затем он находит все таблицы, от которых зависит, и создает их в схеме. ( Этот ответ показывает, как я получаю зависимости)

Некоторые из этих таблиц в настоящее время автоматически заполняются с использованием правил, и это означает, что в таблице pg_depends есть запись, которую можно запросить. В настоящее время мы преобразовываем некоторые из этих правил в триггеры, которые вызывают функции, потому что, когда большие фрагменты данных копируются в схему воспроизведения, currval ('some_sequence') не работает должным образом. ( Этот ответ также предполагает, что это правильный способ сделать это)

К сожалению, это означает, что в pg_depends больше нет записи, и автоматический скрипт, создающий схему, пропускает некоторые таблицы. Есть ли способ для меня получить аналогичную информацию о зависимостях из функций / триггеров? Или вообще есть лучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 18 февраля 2011

Итак, вы хотите знать, какие таблицы используются в функции, вызываемой триггером. Это невозможно. См. В разделе «Остановка проблемы». В текущих версиях PostgreSQL не пытается отслеживать это, даже если это может быть возможно в некоторых случаях (функции языка SQL приходят на ум, но в любом случае вы не можете написать триггеры). Фактически, использование функции полуофициально рекомендуется как способ обойти систему зависимостей.

В вашем приложении вы, вероятно, должны искать способ самостоятельно отслеживать эти зависимости.

0 голосов
/ 16 февраля 2011

Итак, вы ищете способ получить функции, используемые триггером?

SELECT tgfoid FROM pg_trigger WHERE oid = %u

или

SELECT tgfoid FROM pg_trigger WHERE tgrelid = '%s'::regclass AND tgname = '%s'

и так далее.Зависит от того, какая информация у вас есть.

Есть также записи об этом в pg_depend.

...