首页 > 数据库 > 数据库开发技术 > 默认权限"无法选中"?
当我们在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
勤耕细作,用心积微;静待花开,量变质成。
原文作者:象楚之行;如有侵权,请联系管理员删除。