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

k3bvogb1  于 2023-03-01  发布在  PostgreSQL
关注(0)|答案(4)|浏览(1025)

简短的问题...
是否必须使用DROP TRIGGER操作:https://www.postgresql.org/docs/9.1/static/sql-droptrigger.html
或者仅仅从pg_trigger表中删除条目就足够了?

nimxete2

nimxete21#

正确的方法是唯一的。使用drop trigger,即使从pg_trigger删除看起来很好。事实上,它不是。在您手动从pg_trigger删除一个条目后,您可能会得到如下错误(不是立即,而是在您最不期望的时候):
错误:找不到触发器123456的元组
这是因为Postgres也在pg_depend中存储了关于表上的触发器的信息。作为示例性结果,您将无法删除该表。

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

触发器函数并不依赖于触发器,反之亦然,触发器依赖于函数。因此,如果要同时删除触发器和触发器函数,则应使用选项cascade删除函数,例如:

drop function a_trigger_function() cascade;

如果不使用该选项,则在触发器存在时(删除触发器之前)无法删除触发器函数。因此,该问题的另一个答案中的语句具有误导性。
还应注意,在某些情况下,由于一个函数可能会在多个触发器中使用,因此与触发器同时删除函数是不合适的。

m2xkgtsf

m2xkgtsf2#

不要从pg_trigger中删除。此外,在删除触发器之前,必须显式删除触发器所基于的FUNCTION。

ncecgwcz

ncecgwcz3#

当然你应该使用DROP TRIGGER语句,这是标准的和可移植的。

8ljdwjyq

8ljdwjyq4#

触发器本身不应该被删除。但是,如果它被删除了,依赖关系将会保留。下面的查询应该会清理混乱。

DELETE FROM pg_depend d
WHERE d.classid = 'pg_trigger'::regclass
  AND NOT EXISTS (SELECT 1 FROM pg_trigger WHERE oid = d.objid);

相关问题