Azure Cosmos DB for PostgreSQL的pgcrypto扩展权限问题与Hasura迁移报错求助
在Azure Cosmos DB for PostgreSQL中使用pgcrypto扩展的解决方案
问题背景
我正在使用Azure Cosmos DB for PostgreSQL,默认的citus用户需要使用pgcrypto扩展,但当前没有足够权限。由于无法登录默认超级用户postgres,无法自行授予权限。官方文档显示pgcrypto是支持的扩展,但即便它已安装,我也无权限使用,这是否说明文档有误?
另外,我通过部署在Azure容器实例中的Hasura GraphQL构建数据库架构,环境变量传入的连接字符串为:
HASURA_GRAPHQL_DATABASE_URL="postgres://citus:mypassword@my-cosmos-pg-db.tkgkgkjgkjkj.postgres.cosmos.azure.com:5432/citus?sslmode=require"
执行Hasura迁移命令:
hasura migrate apply --endpoint http://my-hasura-engine.eastus.azurecontainer.io --admin-secret myadminsecret
出现报错:
{ "error": "query execution failed", "path": "$", "code": "postgres-error", "internal": { "arguments": [], "error": { "description": null, "exec_status": "FatalError", "hint": null, "message": "must be owner of extension pgcrypto", "status_code": "42501" }, "prepared": false, "statement": "SET check_function_bodies = false;\nCREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public;\nCOMMENT ON EXTENSION pgcrypto IS 'cryptographic functions';\n" } }
解决方案
1. 明确Azure Cosmos DB for PostgreSQL的扩展规则
官方文档没有错误,Azure Cosmos DB for PostgreSQL对扩展的管理有特殊逻辑:
- pgcrypto属于平台预安装的扩展,默认已存在于实例中
citus用户拥有该扩展的使用权限,但没有创建/修改扩展的权限,因此无需手动执行CREATE EXTENSION
2. 修改Hasura迁移脚本
Hasura的迁移脚本尝试创建pgcrypto扩展,这在Azure Cosmos DB for PostgreSQL中是不必要且无权限执行的,需要调整:
- 找到对应迁移文件(路径通常为
migrations/<schema>/<version>.sql) - 删除或注释掉以下语句:
CREATE EXTENSION IF NOT EXISTS pgcrypto WITH SCHEMA public; COMMENT ON EXTENSION pgcrypto IS 'cryptographic functions'; - 保存后重新执行迁移命令
3. 验证扩展可用性
跳过创建步骤后,直接调用pgcrypto的函数(如crypt()、gen_salt())即可,citus用户默认具备这些函数的执行权限。
4. 特殊权限需求处理(非必要)
如果确实需要修改扩展的属性或获取更高权限,只能通过Azure门户/CLI提交支持请求,由Azure团队协助调整——用户无法直接访问超级用户postgres。
内容的提问来源于stack exchange,提问作者gabe
相关产品推荐
相关产品推荐

