我知道我可以用 列出触发器\dft
。但我如何才能看到一个具体的触发器?我想知道触发器在哪些事件上执行、哪个函数执行等等详细信息。
答案1
好的,我自己发现了这一点。
该命令\dft
并不显示触发器本身(正如我所想的那样),它显示所有触发器函数(返回类型触发器)。
要查看您可以创建的触发器\dS <tablename>
,它不仅显示该表的列,还显示该表上定义的所有触发器。
要显示触发函数(或任何函数)的来源,请使用\df+ <functionname>
。
答案2
如果您无权访问 psql 命令,您仍然可以使用:
select pg_get_functiondef('functionname'::regproc);
答案3
您可以尝试以下操作:
SELECT event_object_table,trigger_name,event_manipulation,action_statement,action_timing FROM information_schema.triggers ORDER BY event_object_table,event_manipulation
或者您可以像这样显示名为“testtable”的表的触发器:
SELECT event_object_table,trigger_name,event_manipulation,action_statement,action_timing FROM information_schema.triggers WHERE event_object_table='testtable' ORDER BY event_object_table,event_manipulation
答案4
例如,您可以创建my_t
触发器,该触发器在表上对每一行发生 UPDATE 操作后运行 my_func(),person
如下所示。*我的帖子解释如何创建触发器:
CREATE TRIGGER my_t AFTER UPDATE ON person
FOR EACH ROW EXECUTE FUNCTION my_func();
首先,你需要从触发器如下所示:
postgres=# SELECT oid FROM pg_trigger WHERE tgname = 'my_t';
oid
-------
16429
(1 row)
my_t
然后,你可以使用以下代码获取触发器的代码pg_get_triggerdef()和 OID 如下所示。*我的帖子用以下函数解释 OID:
postgres=# SELECT pg_get_triggerdef(16429);
pg_get_triggerdef
-------------------------------------------------------------------------------------------
CREATE TRIGGER my_t AFTER UPDATE ON public.person FOR EACH ROW EXECUTE FUNCTION my_func()
(1 row)
或者,您可以从中获取 OID ,并立即获取触发器pg_trigger
的代码和 OID,如下所示:my_t
pg_get_triggerdef()
postgres=# SELECT pg_get_triggerdef((SELECT oid FROM pg_trigger WHERE tgname = 'my_t'));
pg_get_triggerdef
-------------------------------------------------------------------------------------------
CREATE TRIGGER my_t AFTER UPDATE ON public.person FOR EACH ROW EXECUTE FUNCTION my_func()
(1 row)