You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL触发器中调用pgsodium函数提示不存在的解决方法

解决方案

可能的原因

触发器函数执行时的搜索路径未包含pgsodium schema,或者NEW.password的类型与函数期望的参数类型不匹配(比如你启用了citext扩展,NEW.password可能是citext类型,而crypto_pwhash_str需要text类型)。

解决方法

方法1:为触发器函数指定包含pgsodium的搜索路径

在创建触发器函数时,显式设置搜索路径,确保函数能找到pgsodium下的函数:

CREATE OR REPLACE FUNCTION update_user() 
RETURNS TRIGGER 
AS $update_user$
BEGIN
    NEW.password := pgsodium.crypto_pwhash_str(NEW.password);
    RETURN NEW;
END
$update_user$ 
LANGUAGE plpgsql
SET search_path = public, pgsodium;

方法2:显式转换参数类型

如果NEW.password是citext类型(因为你安装了citext扩展),需要将其转换为text后再传入函数:

CREATE OR REPLACE FUNCTION update_user() 
RETURNS TRIGGER 
AS $update_user$
BEGIN
    NEW.password := pgsodium.crypto_pwhash_str(NEW.password::text);
    RETURN NEW;
END
$update_user$ 
LANGUAGE plpgsql;

方法3:明确指定函数签名

如果上述方法无效,可以直接指定函数的参数类型签名,避免类型匹配歧义:

CREATE OR REPLACE FUNCTION update_user() 
RETURNS TRIGGER 
AS $update_user$
BEGIN
    NEW.password := pgsodium.crypto_pwhash_str(text => NEW.password);
    RETURN NEW;
END
$update_user$ 
LANGUAGE plpgsql;

验证步骤

  1. 执行\df pgsodium.crypto_pwhash_str查看函数的实际参数和返回类型,确认是否与NEW.password的类型匹配。
  2. 重新创建触发器函数后,触发对应的操作(比如插入/更新用户数据),检查是否仍报错。

内容的提问来源于stack exchange,提问作者Michael T

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:11:08