In questa pagina vengono descritti i privilegi che puoi concedere a un ruolo del database per un controllo dell'accesso granulare.
Per scoprire di più sui ruoli del database e sul controllo dell'accesso dell'accesso granulare, consulta Informazioni sul controllo dell'accesso granulare.
La tabella seguente mostra i privilegi granulari di controllo dell'accesso dell'accesso e gli oggetti di database a cui possono essere concessi.
SELECT | INSERISCI | AGGIORNA | ELIMINA | ESEGUI | |
---|---|---|---|---|---|
Tabella | ✓ | ✓ | ✓ | ✓ | |
Colonna | ✓ | ✓ | ✓ | ||
Visualizza | ✓ | ||||
Modifiche in tempo reale | ✓ | ||||
Funzione di lettura per le modifiche in tempo reale | ✓ | ||||
Sequenza | ✓ | ✓ | |||
Modello | ✓ |
Le sezioni seguenti forniscono i dettagli di ciascun privilegio.
SELECT
Consente al ruolo di leggere o eseguire query da una tabella, visualizzazione, flusso di modifiche, sequenza o modello.
Se per una tabella viene specificato un elenco di colonne, il privilegio è valido solo per quelle colonne. Se non viene specificato alcun elenco di colonne, il privilegio è valido per tutte le colonne della tabella, comprese quelle aggiunte in un secondo momento. Non è consentito un elenco di colonne per una visualizzazione.
Spanner supporta sia le viste dei diritti dell'invoker sia quelle dei diritti del definitore. Per saperne di più, consulta Informazioni sulle viste.
Se crei una vista con diritti dell'invoker, per eseguire una query sulla vista, il ruolo del database o l'utente deve disporre del privilegio
SELECT
per la vista e anche del privilegioSELECT
per gli oggetti sottostanti a cui viene fatto riferimento nella vista. Ad esempio, supponiamo che venga creata la vistaSingerNames
nella tabellaSingers
.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 querySELECT * FROM SingerNames
. Il ruolo deve disporre del privilegioSELECT
nella vista e del privilegioSELECT
nelle tre colonne di riferimento o nell'intera tabellaSingers
.Se crei una vista con diritti di definizione, per eseguire query sulla vista, il ruolo del database o l'utente deve avere solo il privilegio
SELECT
per la vista. Ad esempio, supponiamo che venga creata la vistaAlbumsBudget
nella tabellaAlbums
.CREATE VIEW AlbumsBudget SQL SECURITY DEFINER AS SELECT Albums.Id, Albums.AlbumTitle, MarketingBudget FROM Albums;
Supponiamo che il ruolo del database
Analyst
esegua la querySELECT * FROM AlbumsBudget
. Il ruolo richiede solo il privilegioSELECT
sulla vista. Non richiede il privilegioSELECT
sulle tre colonne di riferimento o nella tabellaAlbums
.Dopo aver concesso
SELECT
a un sottoinsieme di colonne per una tabella, l'utente FGAC non può più utilizzareSELECT *
in quella tabella. Per essere incluse, le query in quella tabella devono assegnare un nome a tutte le colonne.SELECT
concesso per una colonna generata non concedeSELECT
alle colonne di base sottostanti.Per le tabelle con interleaving, il valore
SELECT
concesso nella tabella padre non si propaga alla tabella figlio.Quando concedi
SELECT
in un flusso di modifiche, devi concedere ancheEXECUTE
nella funzione con valore di tabella per il flusso di modifiche. Per ulteriori informazioni, vedi ESEGUIRE.Quando
SELECT
viene utilizzato con una funzione aggregata su colonne specifiche, ad esempioSUM(col_a)
, il ruolo deve disporre del privilegioSELECT
su queste colonne. Se la funzione aggregata non specifica alcuna colonna, ad esempioCOUNT(*)
, il ruolo deve disporre del privilegioSELECT
in almeno una colonna nella tabella.Quando utilizzi
SELECT
con una sequenza, puoi visualizzare solo le sequenze per cui disponi 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 viene specificato un elenco di colonne, l'autorizzazione è valida solo per quelle colonne. Se non viene specificato alcun elenco di colonne, il privilegio è valido per tutte le colonne della tabella.
Se vengono specificati i nomi delle colonne, qualsiasi colonna non inclusa ottiene il valore predefinito al momento dell'inserimento.
Impossibile concedere
INSERT
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 la utilizzi con le sequenze, consenti al ruolo di chiamare la funzione get-next-sequence-value
nella sequenza.
Oltre al privilegio UPDATE
, il ruolo richiede
il privilegio SELECT
su tutte le colonne chiave e su tutte le colonne oggetto di query. Le colonne sottoposte a query includono colonne nella clausola WHERE
e colonne utilizzate per calcolare i nuovi valori delle colonne aggiornate e delle colonne generate.
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.
Non è possibile concedere
DELETE
a livello di colonna.Il ruolo deve anche avere
SELECT
in tutte le colonne chiave e in tutte le colonne che potrebbero essere incluse nelle clausoleWHERE
della query.Per le tabelle con interleaving nei database di dialetti GoogleSQL, il privilegio
DELETE
è richiesto solo nella tabella padre. Se una tabella figlio specificaON DELETE CASCADE
, le righe della tabella figlio vengono eliminate anche senza il privilegioDELETE
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
in un flusso di modifiche, devi anche concedere EXECUTE
nella funzione di lettura per il flusso di modifiche. Per maggiori informazioni, consulta
Modifica delle funzioni di lettura e della sintassi delle query del flusso di modifiche.
Se la utilizzi con i modelli, consenti al ruolo di usare il modello nelle funzioni di machine learning.
Esempio
L'esempio seguente mostra come concedere EXECUTE
nella funzione di lettura per il flusso di modifiche 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;
Passaggi successivi
Per ulteriori informazioni, vedi:
- Configurare un controllo dell'accesso granulare
- Informazioni sul controllo dell'accesso granulare
- Istruzioni GRANT e REVOKE (database di dialetti GoogleSQL)
- Istruzioni GRANT e REVOKE (database di dialetti PostgreSQL)