明确授予对序列列进行更新的权限是必要的吗?

最近,我以超级用户的身份创建了一个表,其中包括一个序列ID列,例如:
create table my_table
(
    id serial primary key,
    data integer
);
我想让我的非超级用户对该表具有写入权限,所以我授予了相应的权限。
grant select, update, insert, delete on table my_table to writer;
在这样做之后的某个随机时间点,由于用户缺少修改与序列列相关联的my_table_id_seq的权限,该用户所做的插入操作开始失败。不幸的是,我无法在我的当前数据库中重现这个问题。 为了解决这个问题,我通过给予用户所需的权限来解决:
grant all on table my_table_id_seq to writer;
有人可以帮我理解为什么在某个时候之后,先前足够的权限可能会开始失效吗? 对于具有序列列的表,授予写入权限的正确方式是什么?
2个回答

你很可能需要:
GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

手册:

使用方法
...
对于序列,此特权允许使用currvalnextval函数。

nextval()是你需要在带有serial列的表上拥有USAGE特权的原因。

由于序列是一种特殊类型的表(出于历史原因),GRANT ... ON TABLE也适用于序列。但通常情况下,你根本不需要这个。

Postgres 10起,我们可以使用IDENTITY列代替serial。这些列在内部使用绑定的序列而无需单独的权限。参见:


我们需要更新这个序列吗? - inquisitive
@anshupitlia:不对。如上所述。 - Erwin Brandstetter

GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO username;
对于所有的序列。

1这完全不是问题所关注的内容。 - mustaccio