一旦了解了基本概念,PostgreSQL特权就非常合乎逻辑。
每个对象都带有自己的访问控制列表(ACL),用于控制谁拥有哪些特权。
每个对象都有一个所有者,即创建它的用户。所有者默认具有所有特权,而所有其他角色均没有特权(后一个规则有很多例外,例如数据库或函数)。只有所有者可以ALTER
或DROP
一个对象。
如果一个对象可以包含其他对象(例如数据库可以包含架构或预订,或者架构可以包含表),则需要CREATE
对该对象具有特权才能在其中创建对象。
因此,我们将其放在一起:
如果您从一个空的数据库开始,则所有用户需要的是CREATE
数据库的特权(将包含在所有权中)。然后,他可以在该数据库中创建模式。由于他当时是这些架构的所有者,因此他拥有CREATE
特权并可以在其中创建对象。
如果您开始使用的数据库不为空,那么您还必须授予该用户对现有对象的特权(或更改这些对象的所有权)。成为数据库的所有者并不意味着成为数据库中所有对象的所有者。
要回答您的特定问题,如果app-user
拥有数据库但CREATE
对模式没有特权public
,app-user
则将能够在数据库中创建新模式并在这些模式中创建对象,但将不能在中创建对象public
。