构建 PostgreSQL 扩展:删除扩展和清理 | Crunchy Data 博客

主要观点:创建了一个使用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删除事件触发器、函数和模式,并在清理函数中删除分离的对象。
阅读 21
0 条评论