在 Rails 模式中启用 UUID 的最简单的最低权限方法是什么?

What's the simplest least-privilege way to enable UUIDs in a Rails schema?

我正在使用一个 Rails 项目,该项目通过 uuid-ossp 扩展使用 UUID。

这是通过在我看来像标准迁移的方式完成的:

class EnableExtensions < ActiveRecord::Migration
  def change
    enable_extension 'plpgsql'
    enable_extension 'uuid-ossp' if Rails.env.development? || Rails.env.test?
  end
end

但是,使用它需要我手动四处走动并设置要使用每个数据库的 postgres 超级用户启用的扩展:

-- enable_extension("uuid-ossp")
rake aborted!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permission denied to create extension "uuid-ossp"
HINT:  Must be superuser to create this extension.
: CREATE EXTENSION IF NOT EXISTS "uuid-ossp"

我不会授予我的用户或 rails 项目用户对我的任何数据库的超级用户权限——这似乎不是一个好习惯。那我该怎么做呢?

注:.

在您无法完成标准迁移过程的情况下,最好的方法可能是在 template1 中启用扩展,这样它们就存在于您创建的每个新数据库中。请记住,如果恢复使用 pg_dump 复制模板 0 而不是默认模板 1 的备份。

显然 https://github.com/dimitri/pgextwlist 将允许您将扩展程序列入白名单,而无需授予超级用户权限。

发现为 answer to Why can only a superuser CREATE EXTENSION hstore, but not on Heroku?