Explizite Erteilung von Berechtigungen zum Aktualisieren der Sequenz für eine serielle Spalte erforderlich?

8

Kürzlich habe ich eine Tabelle als Superuser erstellt, die eine Spalte mit der Seriennummer enthält, z.

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

Da ich wollte, dass mein Nicht-Superuser-Benutzer Schreibzugriff auf diese Tabelle hat, erteilte ich ihr folgende Berechtigungen:

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

Zu einem zufälligen Zeitpunkt danach begannen die von diesem Benutzer vorgenommenen Einfügungen fehlzuschlagen, da dem Benutzer die Berechtigung zum Ändern der my_table_id_seqder seriellen Spalte zugeordneten Sequenz fehlte . Leider kann ich das in meiner aktuellen Datenbank nicht reproduzieren.

Ich habe dies umgangen, indem ich dem Benutzer die erforderliche Berechtigung erteilt habe:

grant all on table my_table_id_seq to writer;

Kann mir jemand helfen zu verstehen

  • Warum können die zuvor ausreichenden Berechtigungen irgendwann fehlschlagen?
  • Was ist der richtige Weg, um eine Schreibberechtigung für eine Tabelle mit einer seriellen Spalte zu erteilen?
moooeeeep
quelle

Antworten:

9

Sie brauchen höchstwahrscheinlich:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

Pro Dokumentation:

VERWENDUNG
...
Für Sequenzen ermöglicht dieses Privileg die Verwendung der Funktionen currvalund nextval.

nextval()ist der Grund, warum Sie das USAGEPrivileg für die Sequenz für eine Tabelle mit serialSpalte benötigen .
Details in dieser verwandten Antwort auf SO.

Da eine Sequenz eine spezielle Art von Tabelle ist (und aus historischen Gründen), GRANT ... ON TABLEfunktioniert sie auch mit Sequenzen. Aber das braucht man normalerweise gar nicht .

Erwin Brandstetter
quelle
Benötigen wir dafür kein UPDATE ON SEQUENCE?
neugierig
@anshupitlia: Nein. Wie oben erklärt.
Erwin Brandstetter