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;
验证步骤
- 执行
\df pgsodium.crypto_pwhash_str查看函数的实际参数和返回类型,确认是否与NEW.password的类型匹配。 - 重新创建触发器函数后,触发对应的操作(比如插入/更新用户数据),检查是否仍报错。
内容的提问来源于stack exchange,提问作者Michael T
相关产品推荐
相关产品推荐

