我有一个要求,即我必须获取与给定表/视图关联的触发器列表。
谁能帮我找到 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
);
information_schema.triggers
(除了速度慢之外)是,根据文档:
视图触发器包含当前定义的所有触发器 当前用户拥有或拥有某些表和视图的数据库 除
以外的特权。SELECT
这意味着,您只能看到您拥有适当权限的触发器。
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,它在对象浏览器中的表节点下显示列表。
在 psql 命令行工具上,您还可以使用
\dS <table_name>
(来自 https://serverfault.com/questions/331024/how-can-i-show-the-content-of-a-trigger-with-psql )
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.
\df 将列出所有函数,包括触发器。
\dft 将列出所有触发器。
我注意到 infoschema 不包含有关触发器的关键关系表信息(至少在 postgres 10 中)。 pg_triggers 确实包含此信息。还注意到,当您编写触发器脚本时,datagrip 不会编写关系表脚本,因此我假设它使用 infoschema 来编写它们的脚本(然后您的表将丢失关系表,并且引用它们的触发器函数将失败)。 PG文档说infoschema中action_reference_old_table的列适用于postgres(10)中不可用的功能,但我肯定正在使用它们,并且它们肯定会出现在pg_triggers中。仅供参考。
您可以使用 information_schema.triggers 和 pg_trigger 显示当前数据库中的所有触发器,如下所示。 *根据我的研究,在 PostgreSQL 中不可能同时显示所有数据库中的所有触发器:
SELECT * FROM information_schema.triggers;
SELECT * FROM pg_trigger;