Postgresql
明確授予更新序列列的序列的權限是必要的嗎?
最近我確實以超級使用者的身份創建了一個表,其中包括一個序列號列,例如,
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
…
對於序列,此權限允許使用
currval
andnextval
函式。
nextval()
是您需要具有列USAGE
的表的序列特權的原因。serial
由於序列是一種特殊的表格(並且出於歷史原因)
GRANT ... ON TABLE
,因此也適用於序列。但是您通常根本不需要它。從Postgres 10開始,我們可以使用**
IDENTITY
**列而不是serial
. 那些在內部使用沒有單獨權限的綁定序列。看: