web-dev-qa-db-ja.com

シリアル列のシーケンスを更新する権限を明示的に付与する必要がありますか?

最近、シリアル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;

誰かが私を理解するのに役立ちますか

  • なぜ、ある時点で、以前は十分であった権限が失敗し始めるのでしょうか?
  • シリアル列を持つテーブルに書き込み権限を付与する適切な方法は何ですか?
8
moooeeeep

あなたはおそらく必要です:

_GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;
_

ドキュメントごと:

使用法
...
シーケンスの場合、この権限はcurrvalおよびnextval関数の使用を許可します。

nextval()は、USAGE列を持つテーブルのシーケンスに対するserial特権が必要な理由です。
SOに関するこの関連回答の詳細

シーケンスは特別な種類のテーブルであるため(そして歴史的な理由から)、_GRANT ... ON TABLE_もシーケンスで機能します。しかし、あなたはそうしますしない通常、それはまったく必要ありません。

9