Heroku数据库中能否为自定义参数设置默认值?
Heroku数据库中能否为自定义参数设置默认值?
这个问题我之前帮不少开发者处理过——你遇到的权限问题其实是Heroku PostgreSQL的权限限制导致的,咱们一步步捋清楚:
首先,本地数据库能正常执行ALTER DATABASE <NAME> SET "app.role" = '';,是因为你大概率用的是超级用户权限(比如默认的postgres账号)操作的,这类账号拥有修改数据库全局配置的权限。但Heroku为了保障整个数据库集群的安全性和稳定性,给你的数据库账号是普通权限用户,没有开放超级用户(SUPERUSER)权限,而设置数据库级别的自定义参数默认值刚好需要这个权限,所以才会抛出permission denied to set parameter "app.extra_permissions"的错误。
那有没有替代方案呢?当然有,这几个方法都很实用:
- 连接时直接指定参数:把自定义参数加到数据库连接字符串里,比如PostgreSQL的连接串可以添加
options='-c app.role='''(注意根据你用的语言调整转义格式),这样每个新建立的数据库连接都会自动带上这个参数的默认值,完全不需要修改数据库配置。 - 会话级参数设置:在应用初始化或者每次获取数据库连接后,执行
SET "app.role" = '';命令,这个操作普通用户就有权限执行,而且设置后会对当前整个数据库会话生效,会话内的所有操作都会使用这个参数值。 - 结合Heroku配置变量管理:先通过
heroku config:set APP_ROLE=''把参数值存在Heroku的配置变量里,然后在应用代码中读取这个变量,再执行SET命令设置会话参数。这种方式的优势是能跟着不同环境(开发/生产)切换参数值,管理起来更灵活。
需要明确的是:Heroku不会开放超级用户权限给普通用户,所以数据库级别的自定义参数默认值设置是无法实现的,上面的替代方案是更符合Heroku环境的可行路径。
内容来源于stack exchange
相关产品推荐
相关产品推荐

