主要观点:创建了一个使用pg_cron
扩展来安排定期活动的 Postgres 扩展,删除扩展时会留下计划的 cron 作业导致错误,思考如何创建能自我清理的扩展。
关键信息:
- 扩展创建时会有 SQL 文件运行,创建的数据库对象有对象依赖关系,删除扩展会删除相关对象。
- 原以为删除扩展能清理
cron
作业,但依赖仅在数据库对象级别,不用于清理。 - 一般建议使用
EVENT TRIGGER
来清理,尝试了CREATE EVENT TRIGGER
但未成功,后改为基于ddl_command_start
事件触发也不行。 - 最终通过
ALTER EXTENSION
来打破依赖,在清理函数中添加DROP SCHEMA
,成功实现扩展删除时的清理。
重要细节: - 展示了创建的函数和事件触发器代码,如
CREATE FUNCTION bridge_stats.cleanup()...
等。 - 验证过程中出现的各种错误信息,如
ERROR: pg_event_trigger_ddl_commands() can only be called in an event trigger function
等。 - 最终验证成功,删除扩展后
cron.job
表为空。
总结:要在 Postgres 扩展中实现清理动作,需创建事件触发器和相关函数,通过ALTER EXTENSION DROP
删除事件触发器、函数和模式,并在清理函数中删除分离的对象。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。