Privilegi di controllo dell'accesso granulare

In questa pagina vengono descritti i privilegi che puoi concedere a un ruolo del database per controllo dell'accesso granulare dell'accesso. Queste informazioni si applicano sia ai database con dialetto GoogleSQL sia ai database con dialetto PostgreSQL.

Per scoprire di più sui ruoli del database e controllo dell'accesso granulare dell'accesso, consulta la panoramica del controllo dell'accesso granulare dell'accesso.

La tabella seguente mostra i privilegi di controllo dell'accesso granulare dell'accesso e gli oggetti del database su cui possono essere concessi.

SELEZIONA INSERT AGGIORNA ELIMINA EXECUTE UTILIZZO
Schema ✓
Tabella ✓ ✓ ✓ ✓
Colonna ✓ ✓ ✓ ✓
Visualizza ✓
Modifiche in tempo reale ✓
Funzione di lettura delle modifiche in tempo reale ✓
Sequenza ✓ ✓
Modello ✓

Le sezioni seguenti forniscono dettagli su ciascun privilegio.

SELECT

Consente al ruolo di leggere o eseguire query da una tabella, una vista, un flusso di modifiche in tempo reale, una sequenza o un modello.

  • Se per una tabella viene specificato un elenco di colonne, il privilegio è valido solo per queste colonne. Se non viene specificato un elenco di colonne, il privilegio è valido per tutte le colonne della tabella, incluse quelle aggiunte in un secondo momento. Un elenco di colonne non è consentito per una vista.

  • Spanner supporta sia le viste con diritti di chi richiama sia le viste con diritti di chi definisce. Per saperne di più, consulta Panoramica delle visualizzazioni.

    Se crei una vista con i diritti di chi richiama, per eseguire query sulla vista, il ruolo o l'utente del database deve disporre del privilegio SELECT sulla vista e del privilegio SELECT sugli oggetti sottostanti a cui viene fatto riferimento nella vista. Ad esempio, supponiamo che la vista SingerNames venga creata sulla tabella Singers.

    CREATE VIEW SingerNames SQL SECURITY INVOKER AS
    SELECT Singers.SingerId, Singers.FirstName, Singers.LastName FROM Singers;
    

    Supponiamo che il ruolo del database myRole esegua la query SELECT * FROM SingerNames. Il ruolo deve disporre del privilegio SELECT sulla vista e del privilegio SELECT sulle tre colonne di riferimento o sull'intera tabella Singers.

    Se crei una vista con i diritti del definer, per eseguire query sulla vista, il ruolo o l'utente del database deve disporre solo del privilegio SELECT sulla vista. Ad esempio, supponiamo che la vista AlbumsBudget venga creata sulla tabella Albums.

    CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS
    SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
    

    Supponiamo che il ruolo del database Analyst esegua la query SELECT * FROM AlbumsBudget. Il ruolo richiede solo il privilegio SELECT sulla vista. Non ha bisogno del privilegio SELECT sulle tre colonne di riferimento o sulla tabella Albums.

  • Dopo aver concesso SELECT su un sottoinsieme di colonne di una tabella, l'utente con controllo dell'accesso granulare dell'accesso non può più utilizzare SELECT * su quella tabella. Le query su questa tabella devono indicare tutte le colonne da includere.

  • SELECT concesso su una colonna generata non concede SELECT sulle colonne di base sottostanti.

  • Per le tabelle con interleaving, SELECT concesso sulla tabella principale non si propaga alla tabella secondaria.

  • Quando concedi SELECT su un flusso di modifiche in tempo reale, devi concedere anche EXECUTE sulla funzione con valori di tabella per il flusso di modifiche in tempo reale. Per saperne di più, consulta EXECUTE.

  • Quando SELECT viene utilizzato con una funzione di aggregazione su colonne specifiche, ad esempio SUM(col_a), il ruolo deve disporre del privilegio SELECT su queste colonne. Se la funzione di aggregazione non specifica alcuna colonna, ad esempio COUNT(*), il ruolo deve avere il privilegio SELECT su almeno una colonna della tabella.

  • Quando utilizzi SELECT con una sequenza, puoi visualizzare solo le sequenze per le quali disponi dei privilegi di visualizzazione.

Esempi di utilizzo di GRANT SELECT

GoogleSQL

GRANT SELECT ON TABLE employees TO ROLE hr_director;

GRANT SELECT ON TABLE customers, orders, items TO ROLE account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO ROLE hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO ROLE hr_rep;

GRANT SELECT ON VIEW orders_view TO ROLE hr_manager;

GRANT SELECT ON CHANGE STREAM ordersChangeStream TO ROLE hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO ROLE role_name;

PostgreSQL

GRANT SELECT ON TABLE employees TO hr_director;

GRANT SELECT ON TABLE customers, orders, items TO account_mgr;

GRANT SELECT(name, level, cost_center, location, manager) ON TABLE employees TO hr_manager;

GRANT SELECT(name, address, phone) ON TABLE employees, contractors TO hr_rep;

GRANT SELECT ON TABLE orders_view TO hr_manager; // orders_view is an invoker rights view

GRANT SELECT ON CHANGE STREAM orders_change_stream TO hr_analyst;

GRANT SELECT ON SEQUENCE sequence_name TO hr_package;

INSERT

Consente al ruolo di inserire righe nelle tabelle specificate. Se viene specificato un elenco di colonne, l'autorizzazione è valida solo per queste colonne. Se non viene specificato un elenco di colonne, il privilegio è valido per tutte le colonne della tabella.

  • Se vengono specificati i nomi delle colonne, qualsiasi colonna non inclusa riceve il valore predefinito al momento dell'inserimento.

  • INSERT non può essere concesso su colonne generate.

Esempi di utilizzo di GRANT INSERT

GoogleSQL

GRANT INSERT ON TABLE employees, contractors TO ROLE hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT INSERT ON TABLE employees, contractors TO hr_manager;

GRANT INSERT(name, address, phone) ON TABLE employees TO hr_rep;

UPDATE

Consente al ruolo di aggiornare le righe nelle tabelle specificate. Gli aggiornamenti possono essere limitati a un sottoinsieme di colonne della tabella. Se utilizzato con le sequenze, consente al ruolo di chiamare la funzione get-next-sequence-value sulla sequenza.

Oltre al privilegio UPDATE, il ruolo deve disporre del privilegio SELECT su tutte le colonne su cui viene eseguita la query. Le colonne interrogate includono le colonne nella clausola WHERE.

UPDATE non può essere concesso su colonne generate.

Esempi di utilizzo di GRANT UPDATE

GoogleSQL

GRANT UPDATE ON TABLE employees, contractors TO ROLE hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO ROLE hr_rep;

PostgreSQL

GRANT UPDATE ON TABLE employees, contractors TO hr_manager;

GRANT UPDATE(name, address, phone) ON TABLE employees TO hr_rep;

DELETE

Consente al ruolo di eliminare righe dalle tabelle specificate.

  • DELETE non può essere concesso a livello di colonna.

  • Il ruolo deve avere anche SELECT su tutte le colonne che potrebbero essere incluse nelle clausole WHERE della query.

  • Per le tabelle con interleaving nei database con dialetto GoogleSQL, il privilegio DELETE è richiesto solo nella tabella principale. Se una tabella secondaria specifica ON DELETE CASCADE, le righe della tabella secondaria vengono eliminate anche senza il privilegio DELETE sulla tabella secondaria.

Esempio di utilizzo di GRANT DELETE

GoogleSQL

GRANT DELETE ON TABLE employees, contractors TO ROLE hr_admin;

PostgreSQL

GRANT DELETE ON TABLE employees, contractors TO hr_admin;

EXECUTE

Quando concedi SELECT su un flusso di modifiche in tempo reale, devi concedere anche EXECUTE sulla funzione di lettura per il flusso di modifiche in tempo reale. Per saperne di più, consulta Funzioni di lettura e sintassi delle query delle modifiche in tempo reale.

Se utilizzato con i modelli, consente al ruolo di utilizzare il modello nelle funzioni di machine learning.

Esempio di utilizzo di GRANT EXECUTE

L'esempio seguente mostra come concedere EXECUTE alla funzione di lettura per il flusso di modifiche in tempo reale denominato my_change_stream.

GoogleSQL

GRANT EXECUTE ON TABLE FUNCTION READ_my_change_stream TO ROLE hr_analyst;

PostgreSQL

GRANT EXECUTE ON FUNCTION spanner.read_json_my_change_stream TO hr_analyst;

UTILIZZO

Quando concedi USAGE a uno schema denominato, fornisci i privilegi per accedere agli oggetti contenuti nello schema denominato. Il privilegio USAGE viene concesso, per impostazione predefinita, allo schema predefinito.

Passaggi successivi