【发布时间】:2021-04-14 14:58:30
【问题描述】:
问题
我有以下使用moddatetime 扩展的触发函数:
/* BEFORE UPDATE trigger - Updates "entity_version.updated_on", setting it to the current UTC time. */
CREATE EXTENSION IF NOT EXISTS moddatetime; -- Needs superuser privileges!
DROP TRIGGER IF EXISTS trig_entity_version_before_update
ON entity_version;
CREATE TRIGGER trig_entity_version_before_update
BEFORE UPDATE
ON entity_version
FOR EACH ROW EXECUTE PROCEDURE moddatetime(updated_on); -- updated_on is TIMESTAMP type
触发器工作得很好,但问题是第一行 (CREATE EXTENSION) 需要超级用户权限。由于这些数据库将由用户(通过脚本)创建,我不希望他们成为创建这些数据库和触发器的用户拥有超级用户访问权限。
我尝试过的
作为第一步,以超级用户身份运行脚本可以正常工作,正如您所期望的那样。
当然,下一步是将作为超级用户创建扩展程序与触发器创建脚本分开。但是这样做,如果我在没有CREATE EXTENSION 行的情况下运行上述脚本,我会收到以下错误:
function moddatetime() does not exist
鉴于脚本从不声明moddatetime,我认为这是有道理的,但我无法在文档中的任何地方找到如何在不使用CREATE EXTENSION 的情况下将扩展定义为可用。当然必须有一种方法来导入或使用扩展而无需创建它?类似于:
USING EXTENSION moddatetime; -- Does something like this exist?
... rest of the trigger script ...
【问题讨论】: