PostgreSQL - 为什么特权用户无法访问新创建的分区

PostgreSQL - Why a privileged user can't access newly created partition

为什么特权用户不能访问新创建的分区?

PostgreSQL 版本:10.0

假设我的 PostgreSQL 服务器有一个名为 app 的用户,具有以下权限:

GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA public to app;

现在这个用户 app 可以为 "existing" table/partition(例如:mytable_partition_old)执行 select、插入和更新操作,正如我的期望,到目前为止一切顺利。

但是,master 帐户在上面的 GRANT 命令之后创建了 table 的新分区,方法如下:

CREATE TABLE IF NOT EXISTS "mytable_partition_new" PARTITION OF mytable FOR VALUES IN('some_value');

创建mytable_partition_new后,用户app通过执行INSERT INTO mytable_partition_new values (...)命令得到"permission denied for this relation"。

我知道可以通过问题 GRANT SELECT, .... TO app 再次解决。 我的问题是是否有更好的方法来实现它?

(我们没有专门的 DBA,在这种情况下被困了一段时间..)

您显示的 GRANT 仅授予 现有 对象的权限。要授予 "future" 个对象的权限,您需要 alter the default privileges:

alter default privileges in schema public
  for role master
  GRANT SELECT, INSERT, UPDATE ON TABLES TO app;

alter default privileges in schema public
  for role master
  GRANT USAGE ON SEQUENCES TO app;

以上只会影响未来个对象,所以对于你已经创建的表(或分区),你需要重新运行你原来的GRANT语句再次。