如何解决在尝试撤销对 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 的拥有者为 rdsadmintemplate1 的拥有者为主用户。如果您使用 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;

有关公共架构的 PostgreSQL 文档

Amazon RDS 上的 PostgreSQL

这篇文章对您有帮助吗?

我们可以改进什么?


需要更多帮助?