Postgresql

明確授予更新序列列的序列的權限是必要的嗎?

  • March 12, 2022

最近我確實以超級使用者的身份創建了一個表,其中包括一個序列號列,例如,

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;

有人可以幫我理解嗎

  • 為什麼在某些時候,以前足夠的權限可能會開始失敗?
  • 為具有串列列的表授予寫權限的正確方法是什麼?

您很可能需要:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

手冊:

USAGE

對於序列,此權限允許使用currvalandnextval函式。

nextval()是您需要具有列USAGE的表的序列特權的原因。serial

由於序列是一種特殊的表格(並且出於歷史原因)GRANT ... ON TABLE,因此也適用於序列。但是您通常根本不需要它。

Postgres 10開始,我們可以使用**IDENTITY**列而不是serial. 那些在內部使用沒有單獨權限的綁定序列。看:

引用自:https://dba.stackexchange.com/questions/71528