У меня есть одно требование: мне нужно получить список триггеров, связанных с данной таблицей/представлением.
Может ли кто-нибудь помочь мне найти триггеры для таблицы в PostgreSQL?
Как получить триггер (ы), связанный с представлением или таблицей в PostgreSQL
Ответ 1
Это вернет все детали, которые вы хотите знать
select * from information_schema.triggers
или если вы хотите отсортировать результаты конкретной таблицы, то вы можете попробовать
SELECT event_object_table
,trigger_name
,event_manipulation
,action_statement
,action_timing
FROM information_schema.triggers
WHERE event_object_table = 'tableName' -- Your table name comes here
ORDER BY event_object_table
,event_manipulation
следующий вернет имя таблицы с триггером
select relname as table_with_trigger
from pg_class
where pg_class.oid in (
select tgrelid
from pg_trigger
)
Ответ 2
Проблема с представлением information_schema.triggers
(помимо того, что он медленный) заключается в документации:
Триггеры представления содержат все триггеры, определенные в текущей базе данных для таблиц и представлений, которые принадлежат текущему пользователю или имеют некоторые привилегии, отличные от
SELECT
on.
Это означает, что вы можете видеть только триггеры, на которые у вас есть соответствующие привилегии.
Чтобы увидеть все триггеры для таблицы, посмотрите в системном каталоге pg_trigger
SELECT tgname
FROM pg_trigger
WHERE tgrelid = 'myschema.mytbl'::regclass; -- optionally schema-qualified
Работает для таблиц и представлений.
Или вы можете использовать графический интерфейс, такой как pgAdmin, который отображает список под узлом таблицы в браузере объектов.
Ответ 3
В командной строке psql вы также можете использовать \dS <table_name>
(от https://serverfault.com/questions/331024/how-can-i-show-the-content-of-a-trigger-with-psql)
Ответ 4
select tgname
,relname
,tgenabled
,nspname from pg_trigger
join pg_class on (pg_class.oid=pg_trigger.tgrelid)
join pg_namespace on (nspowner=relowner);
tgenabled (To check if its disabled)
O = trigger fires in "origin" and "local" modes,
D = trigger is disabled,
R = trigger fires in "replica" mode,
A = trigger fires always.
Ответ 5
Я заметил, что инфосхема НЕ содержит ключевую информацию таблицы отношений о триггерах (по крайней мере, в postgres 10). pg_triggers содержит эту информацию. Также заметил, что datagrip не будет создавать сценарии для таблиц отношений, когда вы создаете сценарии для триггеров, поэтому я предполагаю, что он использует infoschema для их сценария (и тогда в вашей таблице будут отсутствовать таблицы отношений, и триггерные функции, ссылающиеся на них, не будут работать). В документации PG говорится, что столбцы в infoschema для action_reference_old_table применяются к функции, недоступной в postgres (10), но я определенно их использую, и они определенно отображаются в pg_triggers. FYI.