在PostgreSQL中删除触发器的正确方法

4

1
如果可以使用标准SQL,请使用它。也许明天你会与其他关系型数据库管理系统一起工作。 - Sergey Gornostaev
1
永远不要随意更改系统表。所以,不要对pg_trigger进行删除操作。 - user330315
4个回答

7
唯一正确的方式是使用drop trigger,即使从pg_trigger中删除似乎很顺利。实际上并非如此。在您手动从pg_trigger中删除条目后,您可能会在最不希望出现错误时(不是立即)收到以下错误:

ERROR: could not find tuple for trigger 123456

这是因为Postgres还将表触发器的信息存储在pg_depend中。例如,您将无法删除该表。

更新。关于触发器及其相关函数之间的依赖关系的一些说明。

一个触发器函数并不依赖于一个触发器,而是相反,一个触发器依赖于一个函数。因此,如果您想同时删除触发器和触发器函数,您应该使用cascade选项删除该函数,例如:

drop function a_trigger_function() cascade;

如果存在触发器,没有该选项,您将无法删除触发器函数(在删除触发器之前)。因此,问题的另一个答案中的语句是误导性的。

还要注意,有些情况下同时删除函数和触发器是不合适的,因为函数可能会用于许多触发器。


3

不要从pg_trigger表中删除。此外,在删除触发器之前,必须明确删除触发器所基于的函数。


1
不,没有这样的强制要求。当然,如果触发器函数不会被使用,你应该删除它。 - klin
@klin,有没有一种同时删除触发器函数的方法?就像drop trigger xxx cascade一样? - Matthieu
谢谢@klin,我希望我能再次点赞 :) - Matthieu

2

绝对应该使用 DROP TRIGGER 语句来完成这个任务。这是标准且可移植的。


2
触发器本身不应该被删除。但是,如果它被删除了,其依赖关系仍将保留。下面的查询语句应该可以清理这个混乱。
DELETE FROM pg_depend d
WHERE d.classid = 'pg_trigger'::regclass
  AND NOT EXISTS (SELECT 1 FROM pg_trigger WHERE oid = d.objid);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接