简短的问题...是否必须使用DROP TRIGGER操作:https://www.postgresql.org/docs/9.1/static/sql-droptrigger.html或者仅仅从pg_trigger表中删除条目就足够了?
nimxete21#
正确的方法是唯一的。使用drop trigger,即使从pg_trigger删除看起来很好。事实上,它不是。在您手动从pg_trigger删除一个条目后,您可能会得到如下错误(不是立即,而是在您最不期望的时候):错误:找不到触发器123456的元组这是因为Postgres也在pg_depend中存储了关于表上的触发器的信息。作为示例性结果,您将无法删除该表。
drop trigger
pg_trigger
pg_depend
**更新。**关于触发器及其关联函数之间依赖关系的一些说明。
触发器函数并不依赖于触发器,反之亦然,触发器依赖于函数。因此,如果要同时删除触发器和触发器函数,则应使用选项cascade删除函数,例如:
cascade
drop function a_trigger_function() cascade;
如果不使用该选项,则在触发器存在时(删除触发器之前)无法删除触发器函数。因此,该问题的另一个答案中的语句具有误导性。还应注意,在某些情况下,由于一个函数可能会在多个触发器中使用,因此与触发器同时删除函数是不合适的。
m2xkgtsf2#
不要从pg_trigger中删除。此外,在删除触发器之前,必须显式删除触发器所基于的FUNCTION。
ncecgwcz3#
当然你应该使用DROP TRIGGER语句,这是标准的和可移植的。
DROP TRIGGER
8ljdwjyq4#
触发器本身不应该被删除。但是,如果它被删除了,依赖关系将会保留。下面的查询应该会清理混乱。
DELETE FROM pg_depend d WHERE d.classid = 'pg_trigger'::regclass AND NOT EXISTS (SELECT 1 FROM pg_trigger WHERE oid = d.objid);
4条答案
按热度按时间nimxete21#
正确的方法是唯一的。使用
drop trigger
,即使从pg_trigger
删除看起来很好。事实上,它不是。在您手动从pg_trigger
删除一个条目后,您可能会得到如下错误(不是立即,而是在您最不期望的时候):错误:找不到触发器123456的元组
这是因为Postgres也在
pg_depend
中存储了关于表上的触发器的信息。作为示例性结果,您将无法删除该表。**更新。**关于触发器及其关联函数之间依赖关系的一些说明。
触发器函数并不依赖于触发器,反之亦然,触发器依赖于函数。因此,如果要同时删除触发器和触发器函数,则应使用选项
cascade
删除函数,例如:如果不使用该选项,则在触发器存在时(删除触发器之前)无法删除触发器函数。因此,该问题的另一个答案中的语句具有误导性。
还应注意,在某些情况下,由于一个函数可能会在多个触发器中使用,因此与触发器同时删除函数是不合适的。
m2xkgtsf2#
不要从pg_trigger中删除。此外,在删除触发器之前,必须显式删除触发器所基于的FUNCTION。
ncecgwcz3#
当然你应该使用
DROP TRIGGER
语句,这是标准的和可移植的。8ljdwjyq4#
触发器本身不应该被删除。但是,如果它被删除了,依赖关系将会保留。下面的查询应该会清理混乱。