Accorder explicitement des autorisations pour mettre à jour la séquence d'une colonne série est-il nécessaire?

9

Récemment, j'ai créé une table en tant que superutilisateur, y compris une colonne d'identifiant série, par exemple,

create table my_table
(
    id serial primary key,
    data integer
);

Comme je voulais que mon utilisateur non superutilisateur ait un accès en écriture à cette table, je lui ai accordé des autorisations:

grant select, update, insert, delete on table my_table to writer;

À un moment aléatoire après cela, les insertions effectuées par cet utilisateur ont commencé à échouer car l'utilisateur n'avait pas l'autorisation de modifier la séquence my_table_id_seqassociée à la colonne série. Malheureusement, je ne peux pas reproduire cela sur ma base de données actuelle.

J'ai travaillé autour de cela en donnant à l'utilisateur l'autorisation requise, comme ceci:

grant all on table my_table_id_seq to writer;

Quelqu'un peut-il m'aider à comprendre

  • pourquoi, à un moment donné, les autorisations précédemment suffisantes pourraient commencer à échouer?
  • quelle est la bonne façon d'accorder la permission d'écriture pour une table avec une colonne série?
moooeeeep
la source

Réponses:

10

Vous avez très probablement besoin de:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

Par documentation:

UTILISATION
...
Pour les séquences, ce privilège permet l'utilisation des fonctions currvalet nextval.

nextval()est la raison pour laquelle vous avez besoin du USAGEprivilège sur la séquence d'une table avec serialcolonne.
Détails dans cette réponse connexe sur SO.

Puisqu'une séquence est un type spécial de table (et pour des raisons historiques), elle GRANT ... ON TABLEfonctionne également sur les séquences. Mais vous n'en avez normalement pas besoin du tout.

Erwin Brandstetter
la source
N'avons-nous pas besoin d'une MISE À JOUR SUR LA SÉQUENCE pour cela?
curieux
@anshupitlia: Non. Comme expliqué ci-dessus.
Erwin Brandstetter du