È necessario concedere esplicitamente le autorizzazioni per aggiornare la sequenza per una colonna seriale?


9

Recentemente ho creato una tabella come superutente includendo una colonna ID seriale, ad es.

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

Poiché volevo che il mio utente non superutente avesse accesso in scrittura a quella tabella, gli ho concesso le autorizzazioni:

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

In un momento casuale dopo averlo fatto, gli inserimenti effettuati da quell'utente hanno iniziato a fallire perché l'utente non aveva il permesso di modificare la sequenza my_table_id_seqassociata alla colonna seriale. Purtroppo non riesco a riprodurlo sul mio database attuale.

Ho risolto il problema dando all'utente l'autorizzazione necessaria, in questo modo:

grant all on table my_table_id_seq to writer;

Qualcuno può aiutarmi a capire

  • perché, ad un certo punto, le autorizzazioni precedentemente sufficienti potrebbero iniziare a fallire?
  • qual è il modo corretto di concedere l'autorizzazione di scrittura per una tabella con una colonna seriale?

Risposte:


10

Molto probabilmente avrai bisogno di:

GRANT USAGE ON SEQUENCE my_table_id_seq TO writer;

Per documentazione:

UTILIZZO
...
Per le sequenze, questo privilegio consente l'uso delle funzioni currvale nextval.

nextval()è il motivo per cui è necessario il USAGEprivilegio sulla sequenza per una tabella con serialcolonna.
Dettagli in questa risposta correlata su SO.

Poiché una sequenza è un tipo speciale di tabella (e per motivi storici) GRANT ... ON TABLEfunziona anche sulle sequenze. Ma di solito non ti serve affatto.


Non abbiamo bisogno di AGGIORNAMENTO SU SEQUENZA per questo?
curioso

@anshupitlia: No. Come spiegato sopra.
Erwin Brandstetter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.