PUBLIC 权限操作

最近更新时间:2025-09-19 19:07:42

我的收藏
在 PostgreSQL 中,创建某些类型的对象时,系统会默认向 PUBLIC 角色授予特定权限。默认向 PUBLIC 授予的权限如下,更多权限说明请参考 PostgreSQL 官方文档
对象类型
默认 PUBLIC 权限
Databases
CONNECT、TEMPORARY
Functions/Procedures
EXECUTE
Languages
USAGE
Data Types
USAGE
向 PUBLIC 授予权限等同于向所有用户(包括未显式创建的用户)授予该权限。您可以按需求撤销这些默认 PUBLIC 权限,以便更精确地为数据库用户授权,下文将详细为您举例。
说明:
支持 PUBLIC 角色的权限操作能力的内核版本为 v13.22_r1.26、v14.19_r1.35、v15.14_r1.20、v16.10_r1.15、v17.6_r1.9 及以上版本。历史内核小版本的云数据库 PostgreSQL 的实例需要先 升级内核小版本 才能使用该能力。
历史内核小版本的云数据库 PostgreSQL 的实例在升级内核小版本之后,在使用该能力之前需要先在对应的 database 中执行 drop extension tencentdb_superuser;然后执行create extension tencentdb_superuser;
假设您现在有两个数据库账号 am_a 和 dbadmin,详情如下图所示,用户创建请参考 控制台操作指引

其中数据库账号 dbadmin 是 database test_db 的 OWNER,如下图所示:

首先,我们使用账号 dbadmin 登录 database test_db,如下所示:
[am@VM-91-60-centos ~]$psql -h10.*.*.* -p5432 -Udbadmin -dtest_db
Password for user dbadmin:
psql (16.0, server 16.10)
Type "help" for help.
切换到 am_a 账号,我们可以验证 am_a 通过 PUBLIC 拥有 database 的登录权限和系统表的查询权限,具体如下:
test_db=> \\c - am_a
psql (16.0, server 16.10)
You are now connected to database "test_db" as user "am_a".
test_db=> select oid FROM pg_class LIMIT 1;
oid
------
2619
(1 row)
使用 dbadmin 账号回收 PUBLIC 权限后,am_a 账号无法访问系统表:
test_db=> \\c - dbadmin
Password for user dbadmin:
psql (16.0, server 16.10)
You are now connected to database "test_db" as user "dbadmin".
test_db=> REVOKE SELECT ON pg_class FROM PUBLIC;
REVOKE
test_db=> \\c - am_a
Password for user am_a:
psql (16.0, server 16.10)
You are now connected to database "test_db" as user "am_a".
test_db=> select oid FROM pg_class LIMIT 1;
ERROR: permission denied for table pg_class
使用 dbadmin 账号回收 PUBLIC 权限后,am_a 账号无法连接数据库 test_db:
test_db=> \\c - dbadmin
Password for user dbadmin:
psql (16.0, server 16.10)
You are now connected to database "test_db" as user "dbadmin".
test_db=> REVOKE CONNECT ON DATABASE test_db FROM PUBLIC;
REVOKE
test_db=> \\c - am_a
Password for user am_a:
connection to server at "10.*.*.*", port 5432 failed: FATAL: permission denied for database "test_db"
DETAIL: User does not have CONNECT privilege.
Previous connection kept
使用 dbadmin 账号重新授予 am_a 权限后,am_a 可以连接数据库 test_db,也可以访问系统表:
test_db=> \\c - dbadmin
psql (16.0, server 16.10)
You are now connected to database "test_db" as user "dbadmin".
test_db=> GRANT CONNECT ON DATABASE test_db TO am_a;
GRANT
test_db=> GRANT SELECT ON pg_class TO am_a;
GRANT
test_db=> \\c - am_a
Password for user am_a:
psql (16.0, server 16.10)
You are now connected to database "test_db" as user "am_a".
test_db=> select oid FROM pg_class LIMIT 1;
oid
------
2619
(1 row)