如何解决在尝试撤销对 Amazon RDS PostgreSQL 数据库实例的公共架构的访问权时收到的警告消息“不能对 撤销权限”?
上次更新时间:2020 年 3 月 5 日
我尝试在 Amazon Relational Database Service (Amazon RDS) PostgreSQL 数据库实例上执行 REVOKE CREATE ON SCHEMA public FROM PUBLIC。但我收到以下警告消息:“不能对 撤销权限”
我该如何解决此警告消息?
简短描述
默认情况下,用户无法访问不属于他们的架构中的对象。要在架构内部使用对象,必须为用户授予该架构的 USAGE 权限。同样地,为了创建对象,必须授予该架构的 CREATE 权限。然而,所有用户都对公共架构拥有 CREATE 和 USAGE 权限,因此,可以连接数据库的用户拥有在数据库的公共架构中创建对象的权限。如果您不希望所有用户都能够在公共架构中创建对象,则撤销权限:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
注意:在此命令中,public 是架构,PUBLIC 是指所有用户——public 是标识符,且 PUBLIC 是关键字。
当您撤销对 Amazon RDS PostgreSQL 数据库实例的公共架构的 CREATE 权限时,您会收到警告消息“不能对 撤销权限”。当您连接的数据库中的公共架构的拥有者为 rdsadmin 且不是数据库拥有者时,此警告消息通常显示在 RDS 数据库实例中。当使用 template0 而不是默认模板 (template1) 创建数据库时,公共架构的拥有者 rdsadmin 出现的最频繁。有关更多信息,请参阅有关模板数据库的 PostgreSQL 文档。
在 Amazon RDS PostgreSQL 中,数据库 template0 的拥有者为 rdsadmin,template1 的拥有者为主用户。如果您使用 template0 创建数据库,则公共架构的拥有者为 rdsadmin,而不是您的主用户或数据库拥有者。请参阅使用 template0 创建的以下示例数据库:
testpg=> create database tmp0 template template0;
CREATE DATABASE
tmp0=> SELECT n.nspname AS "Name",
pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
List of schemas
Name | Owner
--------+----------
public | rdsadmin
(1 row)
由于拥有者是 rdsadmin,当执行 REVOKE 命令时,将返回警告消息:
tmp0=> REVOKE CREATE ON SCHEMA public FROM PUBLIC;
WARNING: no privileges could be revoked for "public"
REVOKE
解决方法
1.更改公共架构的拥有者:
ALTER SCHEMA public OWNER TO user1;
注意:在此示例命令中,user1 是数据库拥有者。
2.验证所有权已更改:
SELECT n.nspname AS "Name",
pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner"
FROM pg_catalog.pg_namespace n
WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema'
ORDER BY 1;
List of schemas
Name | Owner
--------+----------
public | user1
(1 row)
3.使用拥有数据库 (user1) 的用户名从数据库内部执行撤销命令。
REVOKE CREATE ON SCHEMA public FROM PUBLIC;