模式所有者的隐式权限

Dav*_*idP 6 postgresql permissions

我对 Postgres 中的模式所有者感到困惑。

当我使用AUTHORIZATION关键字定义的所有者创建模式时,所有者可以在该模式中创建对象(pgAdmin4 中的该模式没有显示显式权限)。

但是,当我将架构所有者更改为另一个角色时,此角色无法在该架构中创建对象(除非我明确授予USAGECREATE)。

我想,该架构所有者具有对架构执行任何操作的隐式特权。更改架构所有者芯片的正确方法是什么?

Erw*_*ter 5

我想,该架构所有者具有对架构执行任何操作的隐式特权。

不,事实并非如此。手册GRANT

PostgreSQL允许一个对象所有者撤销自己的普通权限:比如,一个表所有者可以使表只读到自己被撤销自己的INSERTUPDATEDELETE,和TRUNCATE 特权。根据 SQL 标准,这是不可能的。原因是 PostgreSQL 将所有者的权限视为所有者授予自己的权限;因此他们也可以撤销它们。在 SQL 标准中,所有者的权限由假定的实体“_SYSTEM”授予。不是“_SYSTEM”,所有者不能撤销这些权利。

大胆强调我的。

也没有默认权限public

PostgreSQL 将某些类型的对象的默认权限授予PUBLIC. 默认情况下不授予PUBLIC表、列、模式或表空间的权限。(……)

因此,即使是所有者也需要架构的权限 - 默认情况下会提供这些权限!如果你所做的只是:

CREATE SCHEMA test AUTHORIZATION dummy;
Run Code Online (Sandbox Code Playgroud)

或者:

CREATE SCHEMA test;
Run Code Online (Sandbox Code Playgroud)

然后默认权限是NULL,即默认到系统缺省值(这是USAGECREATE用于模式的所有者)。手册GRANT

如果给定对象“访问权限”列为空,则表示该对象具有默认权限(即,其权限列为空)。默认权限始终包括所有者的所有权限,并且可以PUBLIC根据对象类型包括某些权限,如上所述。第一个GRANTREVOKE对象将实例化默认权限(例如,产生{miriam=arwdDxt/miriam}),然后根据指定的请求修改它们。同样,“列访问权限”中仅显示具有非默认权限的列的条目。(注意:为此,“默认权限”始终表示对象类型的内置默认权限。权限已受ALTER DEFAULT PRIVILEGES命令将始终与显式权限条目一起显示,其中包括ALTER.)

如果撤销所有者的权限(可以由所有者自己或超级用户完成),则该角色不具有这些权限。(但所有者也始终可以将这些权限授予他自己。)如果您分配新所有者,则状态将被继承:

-- as user postgres:
CREATE SCHEMA test1;
REVOKE ALL ON SCHEMA test1 FROM postgres;
ALTER schema test1 owner TO dummy;
Run Code Online (Sandbox Code Playgroud)

您现在将看到一个空数组 ( {}) 而不是 NULL:

SELECT nspname AS schema, nspacl AS privileges
FROM   pg_namespace
WHERE  nspname LIKE 'ow%';
Run Code Online (Sandbox Code Playgroud)

(pgAdmin4 从同一个系统表中读取。)

如果您没有明确撤销USAGEand CREATE,则新所有者也拥有​​这些权限。这就是你的描述令人困惑的地方。您是否撤销了旧所有者或新所有者的特权?