暂无图片
暂无图片
2
暂无图片
暂无图片
暂无图片

PostgreSQL17中psql优化默认权限和空权限的显示

387

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 / –

可以通过下面的方式联系我

  • 微信公众号:@墨竹札记
  • 墨天轮:@墨竹
  • 微信:wshf395062788
  • PGFans:@墨竹

如果这篇文章为你带来了灵感或启发,就请帮忙点赞收藏转发;如果文章中不严谨或者错漏之处,请及时评论指正。非常感谢!

最后修改时间:2025-02-06 11:00:45
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论