我有一个使用postgres数据库的应用程序。我有一个超级管理员用户。现在我还需要两个用户:一个"application-user";一个具有crud -特权,另一个具有ALTER和create -特权(用于应用迁移)。这些都是我需要的用户,因为应用程序有自己的User-Access管理,而且根本不打算改变这一点。
我想要这样的:GRANT SELECT, INSERT, UPDATE, DELETE ON DATABASE MyDatabase TO myuser
我在这里读到postgres提供预定义的角色。这很好——但这些角色适用于全球(正如一条评论所指出的那样)。我的数据库是在public
模式下,这变得有问题,因为一些系统表也在公共-我不希望我的用户能够读取或写入这些。
我可以用GRANT pg_read_all_data, pg_write_all_data ON DATABASE MyDatabase TO myuser
,但这不起作用。
因为我不会经常改变这些特权,我甚至可以很好地使用GRANT pg_read_all_data ON MyDatabase.MyTable TO myuser
。但这也行不通。
对此有什么想法吗?
PostgreSQL没有ALTER
和CREATE
权限。能够运行ALTER
和CREATE
语句的数据库用户必须是数据库对象的所有者。如果你的对象已经被另一个用户拥有了,你必须改变它的所有权。
对于另一个用户,您必须在每个对象上授予权限。数据库上的特权没有帮助——对象之间没有特权继承。不要忘记在模式上授予USAGE
。
我建议您创建比public
更多的模式。如果应用程序的对象有单独的模式,可以使用像
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA myapp TO someuser;