如何在PostgreSQL中获取与视图或表关联的触发器

如何在PostgreSQL中获取与视图或表关联的触发器,sql,database,postgresql,Sql,Database,Postgresql,我有一个要求,就是必须获得与给定表/视图关联的触发器列表。 有人能帮我在PostgreSQL中找到表的触发器吗?这将返回您想要知道的所有详细信息 select * from information_schema.triggers 或者,如果要对特定表的结果进行排序,可以尝试 SELECT event_object_table ,trigger_name ,event_manipulation ,action_statement ,action_t

我有一个要求,就是必须获得与给定表/视图关联的触发器列表。

有人能帮我在PostgreSQL中找到表的触发器吗?

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

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
        )
视图的问题(除了速度慢之外)是:

视图触发器包含当前视图中定义的所有触发器 当前用户拥有或拥有的表和视图上的数据库 除
之外的特权选择
打开

也就是说,您只能看到您拥有相应权限的触发器

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

适用于表格和视图。

或者您可以使用类似pgAdmin的GUI在对象浏览器中的表节点下显示列表。

在psql命令行工具上,您也可以使用
\dS
(from)

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

谢谢您提供详细信息。信息\u schema.triggers也会有视图条目?@dude-我们可以为视图获取它吗。有什么方法可以让它查看吗?dude-它没有显示select*from information_schema.triggers;的任何视图;。由于视图不是物理实体,因此不会在information_schema.triggers表中显示它。与用于创建视图的表相关的触发器是什么。我的理解是否正确请纠正我如何删除我从这个查询中获得的触发器•选择事件对象模式作为表模式,选择事件对象表作为表名称,选择触发器模式,选择触发器名称,选择字符串agg(事件操作,,)作为事件,选择动作计时作为激活,选择动作条件作为条件,action_语句作为信息_schema.triggers的定义,其中事件_object_table,如'his_%'和trigger_name='set_timestamp'按1,2,3,4,6,7,8的顺序按表_schema,table_name分组;Pgadmin在查看表时会向您显示有关该表的大量信息。它也显示触发器吗?我知道这不是问题的答案,只是好奇。@Bill-pgadmin工具不在盒子里。虽然这段代码可以回答问题,提供有关此代码为什么和/或如何回答此问题的附加上下文可提高其长期价值。恐怕我看不出它如何像查看
信息\u schema.触发器那样有用(假设有适当的特权)。通过该视图,我得到了
触发器名称
事件操作
(即,I,U,D),
动作时间
(例如,在之前),触发器作用的
事件对象表
,以及
动作语句
。使用
SELECT tgname…
我得到的只是触发器名称,它似乎缺少很多上下文,而
pg_trigger
中的其他字段似乎没有那么多信息。我觉得我一定错过了什么。@Randall:这个问题要求列出一个触发器列表。也许你想就你的需求提出你自己的问题?@Randall这是一个内部系统表,因此它需要一些额外的解释来人性化。这不包括“系统生成的触发器”,例如外键约束,以防你(本评论的读者)想看到这些。请参阅,以获取包含这些内容的解决方案。
SELECT tgname
FROM   pg_trigger
WHERE  tgrelid = 'myschema.mytbl'::regclass; -- optionally schema-qualified
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.