Privilegi granulari per il controllo dell'accesso

In questa pagina vengono descritti i privilegi che è possibile concedere a un ruolo di database per un controllo dell'accesso granulare.

Per informazioni sui ruoli del database e sul controllo dell'accesso granulare, consulta Informazioni sul controllo dell'accesso granulare.

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

SELEZIONA INSERISCI AGGIORNA ELIMINA ESEGUI 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, uno stream di modifiche, una sequenza o un modello.

  • Se un elenco di colonne è specificato per una tabella, il privilegio è valido solo colonne. Se non viene specificato alcun 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 visualizzazione.

  • Spanner supporta sia le visualizzazioni dei diritti dell'invocatore che quelle del definitore delle visualizzazioni dei diritti umani. Per saperne di più, consulta Informazioni sulle visualizzazioni.

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

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

    Supponiamo che il ruolo di database myRole esegua la query SELECT * FROM SingerNames. Il ruolo deve avere il privilegio SELECT per la visualizzazione e deve disporre del privilegio SELECT per le tre colonne di riferimento o nella l'intera tabella Singers.

    Se crei una vista con i diritti del definitore, 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 visualizzazione AlbumsBudget sia creata nella tabella Albums.

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

    Supponiamo che il ruolo di database Analyst esegua la query SELECT * FROM AlbumsBudget. Il ruolo richiede solo il privilegio SELECT nella vista. Non è necessario il privilegio SELECT per le tre colonne a cui si fa riferimento o per la tabella Albums.

  • Dopo aver concesso SELECT su un sottoinsieme di colonne di una tabella, l'utente FGAC può non usano più SELECT * in quella tabella. Le query di quella tabella devono assegnare un nome a tutti colonne da includere.

  • SELECT concesso per una colonna generata non concede SELECT sulla colonna sottostante colonne di base.

  • Per le tabelle con interleaving, i diritti SELECT concessi alla tabella principale non vengono propagati alla tabella secondaria.

  • Quando concedi SELECT su una modifica in tempo reale, devi concedere anche EXECUTE su la funzione con valore di tabella per il flusso di modifiche. Per ulteriori informazioni, vedi ESEGUI.

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

  • Quando utilizzi SELECT con una sequenza, puoi visualizzare solo le sequenze che dispongono dei privilegi di visualizzazione.

Esempi

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 un elenco di colonne è specificato, l'autorizzazione è valida solo colonne. Se non viene specificato nessun elenco di colonne, il privilegio è valido su tutti colonne nella tabella.

  • Se vengono specificati nomi di colonna, tutte le colonne non incluse ottiene il valore predefinito al momento dell'inserimento.

  • INSERT non può essere concesso per le colonne generate.

Esempi

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 lo utilizzi con le sequenze, consente al ruolo di chiamare la funzione get-next-sequence-value sulla sequenza.

Oltre al privilegio UPDATE, il ruolo deve il privilegio SELECT su tutte le colonne sottoposte a query. Le colonne su cui è stata eseguita la query includono le colonne nella clausola WHERE.

Impossibile concedere UPDATE per le colonne generate.

Esempi

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.

  • Impossibile concedere DELETE a livello di colonna.

  • Il ruolo richiede inoltre SELECT per tutte le colonne che potrebbero essere incluse nelle clausole WHERE della query.

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

Esempio

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 una modifica in tempo reale, devi concedere EXECUTE anche nella di lettura per il flusso di modifiche. Per ulteriori informazioni, consulta Funzioni di lettura e sintassi delle query per i flussi di modifiche.

Se lo utilizzi con i modelli, il ruolo può utilizzarli nelle funzioni di machine learning.

Esempio

L'esempio seguente mostra come concedere EXECUTE alla funzione di lettura per il stream di variazioni 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, questo fornisce i privilegi per accedere contenuti nello schema denominato. Il privilegio USAGE viene concesso da lo schema predefinito.

Passaggi successivi

Per ulteriori informazioni, vedi: