明确授予更新序列列序列的必要权限?

moo*_*eep 10 postgresql permissions sequence

最近我确实以超级用户的身份创建了一个表,其中包括一个序列号列,例如,

create table my_table
(
    id serial primary key,
    data integer
);
Run Code Online (Sandbox Code Playgroud)

因为我希望我的非超级用户用户拥有对该表的写访问权限,所以我授予了它权限:

grant select, update, insert, delete on table my_table to writer;
Run Code Online (Sandbox Code Playgroud)

在这样做之后的随机时间点,该用户所做的插入开始失败,因为该用户没有修改my_table_id_seq与串行列关联的序列的权限。不幸的是,我无法在我当前的数据库上重现它。

我通过授予用户所需的权限来解决这个问题,如下所示:

grant all on table my_table_id_seq to writer;
Run Code Online (Sandbox Code Playgroud)

有人可以帮我理解

  • 为什么,在某些时候,以前足够的权限可能会开始失败?
  • 为具有串行列的表授予写权限的正确方法是什么?

Erw*_*ter 11

您很可能需要:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;
Run Code Online (Sandbox Code Playgroud)

根据文档:

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

nextval()是您需要USAGE具有serial列的表的序列特权的原因。
关于 SO 的相关答案中的详细信息。

由于序列是一种特殊的表(并且出于历史原因)也GRANT ... ON TABLE适用于序列。但是您通常根本不需要它。