ITPub博客

首页 > 数据库 > 数据库开发技术 > 默认权限"无法选中"?

默认权限"无法选中"?

原创 数据库开发技术 作者:象楚之行 时间:2024-07-22 08:00:00 0 删除 编辑

当我们在psql里使用命令查看数据库对象的默认权限时,可能会遇到糟糕的体验,以schema为例:

CREATE SCHEMA s1;

postgres用户作为owner默认拥有s1的全部权限:USAGE和CREATE,大家应该知道这个常识。

可如果使用\dn+命令进行权限检查,不会获得任何返回信息(下面的第3列)。

postgres=# \dn+ s1
List of schemas
-[ RECORD 1 ]-----+---------
Name | s1
Owner | postgres
Access privileges |
Description |

此时对象的权限并未记录到系统表中,从下面查询语句的nspacl字段值可以确认

SELECT nspacl IS NULL
FROM pg_namespace
WHERE oid = 's1'::regnamespace;
?column?
----------
t
(1 row)

惊喜的是,一旦使用GRANT或REVOKE命令进行操作后,系统表acl相关字段就会记录权限信息

GRANT USAGE ON SCHEMA s TO public;
REVOKE USAGE ON SCHEMA s FROM public;

上面两条命令分别做了一次GRANT和REVOKE正反向操作,s1的权限表面上并未发生变化,不过此时owner的默认权限会得到展示:

List of schemas
-[ RECORD 1 ]-----+---------------------
Name | s1
Owner | postgres
Access privileges | postgres=UC/postgres
Description |

接着我们对owner执行回收权限命令:

REVOKE ALL ON SCHEMA s1 FROM postgres;

此时再使用\dn+命令进行权限检查,与刚开始创建s1时显示的结果是一样的:

postgres=# \dn+ s1
List of schemas
-[ RECORD 1 ]-----+---------
Name              | s1
Owner             | postgres
Access privileges |
Description       |

这两种场景目前psql无法区分,对象的默认权限根本无法选中!

不过数据库对象的默认权限或无权限实际存储是有差异的:

  • 默认权限在系统表字段里为NULL

  • 无权限在系统表字段存储为空

而即将发布的新版本17能比较友好的展示默认权限,通过\pset命令对NULL设置可视化输出

\pset null '(NULL)'

默认权限展示如下:

postgres=# \dn+ s1
List of schemas
-[ RECORD 1 ]-----+---------
Name | s1
Owner | postgres
Access privileges | (NULL)
Description | (NULL)

无权限时展示如下:

postgres=# \dn+ s1
List of schemas
-[ RECORD 1 ]-----+---------
Name | s1
Owner | postgres
Access privileges | (none)
Description | (NULL)

第3列权限的展示非常明显,默认权限才显示NULL。

推荐阅读

与我联系

  • 微信公众号:象楚之行

  • 墨天轮:https://www.modb.pro/u/15675

  • 微信:skypkmoon

勤耕细作,用心积微;静待花开,量变质成。


原文作者:象楚之行;如有侵权,请联系管理员删除。

请登录后发表评论 登录
全部评论

注册时间:2018-06-12

  • 博文量
    102
  • 访问量
    50362