在 PostgreSQL 15 中public,每个数据库拥有的默认模式将具有一组不同的权限。事实上,在 PostgreSQL 15 之前,每个用户都可以操作public他不是所有者的数据库的模式。由于即将推出的新版本,只有数据库所有者将被授予对public模式的完全访问权限,而其他用户将需要获得明确的GRANT:
想象用户luca是数据库的所有者testdb:这意味着他可以对数据库做任何他想做的事情。
testdb=> SHOW server_version;
server_version
----------------
15beta2
(1 row)
testdb=> SELECT current_role, current_user;
current_role | current_user
--------------+--------------
luca | luca
(1 row)
testdb=> CREATE TABLE mytable( t text );
CREATE TABLE
另一方面,另一个用户,比如说pgbench,不能:
testdb=> SELECT current_role, current_user;
current_role | current_user
--------------+--------------
pgbench | pgbench
(1 row)
testdb=> CREATE TABLE mytable2( t text );
ERROR: permission denied for schema public
LINE 1: CREATE TABLE mytable2( t text );
testdb=> select * from mytable;
ERROR: permission denied for table mytable这意味着它public不是作为用户定义的模式进行管理的,因此为了允许其他用户进行操作,GRANT必须执行显式。
改变的是不再有schema的CREATE权限public,而YUSAGE和以前一样。因此,为了允许非所有者创建对象,GRANT CREATE ON SCHEMA public TO pgbench必须执行显式语句。
这会影响新创建的数据库,而不是从以前的备份中恢复的数据库。
但是有一个技巧可以帮助恢复以前的行为:如果您在template1(或在模板数据库中)设置权限,您可以在新数据库上免费使用它们:
template1=# GRANT CREATE ON SCHEMA public TO PUBLIC;
GRANT
template1=# CREATE DATABASE newdb WITH OWNER luca;
CREATE DATABASE现在,作为非拥有用户收集:
% psql -U pgbench -h localhost newdb
newdb=> create table foo( i int );
CREATE TABLE权限与以前的 PostgreSQL 版本一样。
目前尚不清楚一旦 PostgreSQL 版本处于 beta 状态,上述技巧是否会继续存在,无论如何我不鼓励你采用它。选择默认撤销 `public` schmea 的权限可能很烦人,但在安全性方面是一个不错的选择,它会迫使您决定如何处理权限。
作者:Luca Ferrari
文章来源:https://fluca1978.github.io/2022/07/15/PostgreSQL15PublicSchema.html
最后修改时间:2022-07-21 09:56:58
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




