Postgres中CREATE EXTENSION异常:pgcrypto未安装到指定schema问题
为什么pgcrypto扩展被安装到public而不是指定的app_auth schema?
嘿,我明白问题出在哪了!核心原因是:如果你的数据库里public schema已经存在pgcrypto扩展,那么CREATE EXTENSION IF NOT EXISTS ... WITH SCHEMA app_auth这条语句会直接跳过安装操作,并不会把已有的扩展迁移到你指定的app_auth schema里。
PostgreSQL的CREATE EXTENSION IF NOT EXISTS逻辑很明确:只要目标扩展在数据库的任意schema中已经存在,就不会执行新的安装(包括不会修改它的存放位置);只有当扩展完全不存在时,才会按照你指定的WITH SCHEMA参数来创建。
先验证问题
你可以查一下系统表确认pgcrypto当前的位置:
SELECT extname, extnamespace::regnamespace FROM pg_extension WHERE extname = 'pgcrypto';
如果结果里extnamespace显示为public,那就实锤了——扩展早就存在于public schema,这就是你测试时调用app_auth.gen_random_bytes报错的原因。
解决方法很简单
要把pgcrypto装到app_auth schema,得先卸载已有的扩展,再重新指定schema安装:
-- 1. 先卸载已有的pgcrypto(如果存在) DROP EXTENSION IF EXISTS pgcrypto; -- 2. 重建app_auth schema(如果之前的操作没问题可以跳过这步) DROP SCHEMA IF EXISTS app_auth CASCADE; CREATE SCHEMA app_auth; -- 3. 把pgcrypto安装到app_auth schema CREATE EXTENSION pgcrypto WITH SCHEMA app_auth;
再测试看看
现在执行你的测试代码应该就没问题了:
-- 测试1:设置搜索路径为app_auth SET search_path = app_auth; SELECT gen_random_bytes(10); -- 这时候应该能正常返回结果 -- 测试2:直接指定schema调用 SELECT app_auth.gen_random_bytes(10); -- 同样能成功
这样就能确保pgcrypto的所有函数都在app_auth schema下可用啦。
内容的提问来源于stack exchange,提问作者ZhongHua Yan
相关产品推荐
相关产品推荐

