Подтвердить что ты не робот

Как получить триггер (ы), связанный с представлением или таблицей в PostgreSQL

У меня есть одно требование: мне нужно получить список триггеров, связанных с данной таблицей/представлением.
Может ли кто-нибудь помочь мне найти триггеры для таблицы в PostgreSQL?

4b9b3361

Ответ 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, который отображает список под узлом таблицы в браузере объектов.

Ответ 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.