如何为具有完全访问权限但不能删除数据库的 Rails 应用程序添加 PSQL 用户

how to add PSQL user For a Rails app that has full access but can't drop the database

如何配置不是超级用户且不拥有数据库的 PSQL v11.4 用户。 该用户应该具有创建 SQL 对象和删除它们的完全访问权限,即使 虽然他们不拥有数据库,所以他们不能删除数据库。 PUBLIC 架构中存在所有 sql/database 个对象。

到目前为止我已经尝试过:

CREATE USER app_user WITH ENCRYPTED PASSWORD 'foo_bar';
ALTER USER app_user NOCREATEDB NOCREATEROLE;
ALTER USER app_user VALID UNTIL 'infinity';
GRANT ALL PRIVILEGES ON DATABASE database TO app_user;

当 运行 Rails 迁移时,我得到以下错误: remote: PG::InsufficientPrivilege: ERROR: permission denied for table schema_migrations

似乎 psql 最佳实践是拥有一个具有特权的角色 设置,然后将用户指定为该角色的成员。然而因为一切 在 public 架构上,所有 users/roles 都应该具有完全访问权限吗?然而 文档中的这一行让我失望:

“删除对象或以任何方式更改其定义的权利不被视为可授予的特权;它是所有者固有的,不能授予或撤销。(但是,类似的效果可以通过授予或撤销拥有该对象的角色的成员资格来获得;见下文。)所有者也隐含地拥有该对象的所有授予选项。"

来自:https://www.postgresql.org/docs/11/sql-grant.html

此外,由于正在通过 sudo 用户恢复数据库,对象 将由 sudo 用户拥有,但是新对象可能属于 app_user,这是个问题吗?

您需要数据库的 CREATE 权限,并且您需要 pg_dump(或 pg_restore 以及 -x-O 选项,所以恢复用户成为对象所有者并且未授予其他权限。

有些东西,例如某些扩展、事件触发器或不受信任语言的函数(举几个例子)需要超级用户权限才能创建它们。避免此类对象或提前创建它们并忽略错误。