简短的问题...
在删除触发器时,是否必须使用DROP TRIGGER操作: https://www.postgresql.org/docs/9.1/static/sql-droptrigger.html
或者仅从pg_trigger表中删除条目就足够了?
简短的问题...
在删除触发器时,是否必须使用DROP TRIGGER操作: https://www.postgresql.org/docs/9.1/static/sql-droptrigger.html
或者仅从pg_trigger表中删除条目就足够了?
drop trigger
,即使从pg_trigger
中删除似乎很顺利。实际上并非如此。在您手动从pg_trigger
中删除条目后,您可能会在最不希望出现错误时(不是立即)收到以下错误:
ERROR: could not find tuple for trigger 123456
这是因为Postgres还将表触发器的信息存储在pg_depend
中。例如,您将无法删除该表。
更新。关于触发器及其相关函数之间的依赖关系的一些说明。
一个触发器函数并不依赖于一个触发器,而是相反,一个触发器依赖于一个函数。因此,如果您想同时删除触发器和触发器函数,您应该使用cascade
选项删除该函数,例如:
drop function a_trigger_function() cascade;
如果存在触发器,没有该选项,您将无法删除触发器函数(在删除触发器之前)。因此,问题的另一个答案中的语句是误导性的。
还要注意,有些情况下同时删除函数和触发器是不合适的,因为函数可能会用于许多触发器。
不要从pg_trigger表中删除。此外,在删除触发器之前,必须明确删除触发器所基于的函数。
drop trigger xxx cascade
一样? - Matthieu绝对应该使用 DROP TRIGGER
语句来完成这个任务。这是标准且可移植的。
DELETE FROM pg_depend d
WHERE d.classid = 'pg_trigger'::regclass
AND NOT EXISTS (SELECT 1 FROM pg_trigger WHERE oid = d.objid);
pg_trigger
进行删除操作。 - user330315