PostgreSQL17中psql优化默认权限和空权限的显示
在PostgreSQL16中存在这样一个问题,默认权限在目录ACL列中表示为NULL::aclitem[],而撤销所有权限将留下一个空的aclitem[],但是空数组不等于NULL,但是如何在命令输出中区分两者呢?
在PostgreSQL17中,当通过\pset null '(null)'设置null的显示后,默认权限在界面显示为了“(null)”,空权限显示为了“(none)”,通过这种方式把默认权限和空权限区分开来,即使没有特殊权限存在。详细操作如下:
PostgreSQL16.3的执行计划
创建表并查看表的默认权限(Access privileges)
testdb=# CREATE TABLE t2 (a int);
CREATE TABLE
testdb=# \dp+ t2
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------
public | t2 | table | | |
(1 row)
设置NULL的显示方式并查看表结构
testdb=# \pset null '(null)'
Null display is "(null)".
testdb=# \dp+ t2
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------
public | t2 | table | | |
(1 row)
可以看到在PostgreSQL16.3中即使设置了\pset null,也不会影响显示的null值
回收对象的权限并查看表结构
testdb=# REVOKE ALL ON TABLE t2 FROM CURRENT_USER;
REVOKE
testdb=# \dp+ t2
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------
public | t2 | table | | |
(1 row)
PostgreSQL17.0Beta 1
建表并查看表结构
testdb=# CREATE TABLE t2 (a int);
CREATE TABLE
testdb=# \dp+ t2
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------
public | t2 | table | | |
(1 row)
正常建表后,默认权限则显示空
设置null值并查看表结构
testdb=# \pset null '(null)'
Null display is "(null)".
testdb=# \dp+ t2
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------
public | t2 | table | (null) | |
(1 row)
在\pset null设置后,默认权限则显示(null)
回收表上的所有权限并查看表结构
testdb=# REVOKE ALL ON TABLE t2 FROM CURRENT_USER;
REVOKE
testdb=# \dp+ t2
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
--------+------+-------+-------------------+-------------------+----------
public | t2 | table | (none) | |
(1 row)
如果没有特权(一个空数组),则显示一个特殊值(none)。
总结
在PostgreSQL17版本中,我们可以通过\pset null '(null)'设置null的显示后来区分默认权限和空权限,默认权限在界面显示为了“(null)”,空权限显示为了“(none)”,对于\pset null我们也可以设置为其他的方式展示,比如\pset null ‘(defaull)’。这个功能虽然比较小,但是一些特殊的时候还是比较有用的。
– / END / –
可以通过下面的方式联系我
如果这篇文章为你带来了灵感或启发,就请帮忙点赞、收藏、转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!
最后修改时间:2025-02-06 11:00:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




