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语句再次。
为什么特权用户不能访问新创建的分区?
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语句再次。