PostgreSQL 中有没有办法检查当前上下文是否在CREATE EXTENSION
或期间ALTER EXTENSION … UPDATE
?
我正在将我使用自制的 PostgreSQL 迁移框架管理的一些模式切换为基于扩展。在我的迁移框架中,我有多种方式来查看我是否在迁移中运行,并且我希望在扩展安装/升级期间看到类似的东西。
也许我必须抛出并捕获异常并检查堆栈?我希望不是…
上下文 [22 年 11 月 21 日添加]:我想创建一个事件触发器来忽略属于扩展安装和升级的一部分的事件。老实说,我真的不需要这个。(我意识到,在我的用例中,扩展安装无论如何都是从迁移中处理的。)但是,作为一个理论练习,我仍然想知道这是否可能。
扩展脚本有一个神奇的标记,
@extschema@
它被替换为目标模式名称。您可以检查是否发生替换。我不确定它是否可以在字符串文字中并仍然被替换;它旨在用于标识符。PostgreSQL 手册中的详细信息。由于扩展脚本必须位于一个特殊的位置,并且只能通过
CREATE EXTENSION
/调用,ALTER EXTENSION UPDATE
并且可以防止被包含在 via 中psql
,因此您可以相当确定您的代码是如何被调用的。您可以在代码上放置一个包装器,通过参数将源标识符传递给内部函数。我本可以转向事件触发器文档来寻找答案:https ://www.postgresql.org/docs/current/functions-event-triggers.html
record
返回的集合中的一列pg_event_trigger_ddl_commands()
是:in_extension
,它是“[t]rue if the command is part of an extension script”。