如何显示与 PostgreSQL 中的视图或表关联的触发器?

问题描述 投票:0回答:7

我有一个要求,即我必须获取与给定表/视图关联的触发器列表。
谁能帮我找到 PostgreSQL 中表的触发器?

sql database postgresql triggers postgresql-triggers
7个回答
97
投票

这将返回您想知道的所有详细信息

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
        );

42
投票

视图的问题

information_schema.triggers
(除了速度慢之外)是,根据文档

视图触发器包含当前定义的所有触发器 当前用户拥有或拥有某些表和视图的数据库 除

SELECT
以外的特权。

这意味着,您只能看到您拥有适当权限的触发器。

要查看表的 all 触发器,请查看系统目录

pg_trigger

SELECT tgname
     , tgisinternal, pg_get_triggerdef(oid) AS definition  -- optional additions
FROM   pg_trigger
WHERE  tgrelid = 'myschema.mytbl'::regclass;  -- optionally schema-qualified

我添加了

tgisinternal
来显示哪些是内部触发器,并添加了
pg_get_triggerdef(oid)
来获取定义(主要与非内部触发器相关)。

适用于表视图。
或者您可以使用像 pgAdmin 这样的 GUI,它在对象浏览器中的表节点下显示列表。


10
投票

在 psql 命令行工具上,您还可以使用

\dS <table_name>
(来自 https://serverfault.com/questions/331024/how-can-i-show-the-content-of-a-trigger-with-psql


2
投票
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.

1
投票

\df 将列出所有函数,包括触发器。

\dft 将列出所有触发器。


0
投票

我注意到 infoschema 不包含有关触发器的关键关系表信息(至少在 postgres 10 中)。 pg_triggers 确实包含此信息。还注意到,当您编写触发器脚本时,datagrip 不会编写关系表脚本,因此我假设它使用 infoschema 来编写它们的脚本(然后您的表将丢失关系表,并且引用它们的触发器函数将失败)。 PG文档说infoschema中action_reference_old_table的列适用于postgres(10)中不可用的功能,但我肯定正在使用它们,并且它们肯定会出现在pg_triggers中。仅供参考。


0
投票

您可以使用 information_schema.triggerspg_trigger 显示当前数据库中的所有触发器,如下所示。 *根据我的研究,在 PostgreSQL 中不可能同时显示所有数据库中的所有触发器:

SELECT * FROM information_schema.triggers;
SELECT * FROM pg_trigger;
© www.soinside.com 2019 - 2024. All rights reserved.