Creare e gestire le visualizzazioni

Questa pagina descrive come creare e gestire le viste Spanner per i database con dialetto GoogleSQL e i database con dialetto PostgreSQL. Per saperne di più sulle viste Spanner, consulta la Panoramica delle viste.

Autorizzazioni

Per creare, concedere e revocare l'accesso a una vista, devi disporre dell' spanner.database.updateDdl.

Crea una vista

Per creare una vista, utilizza l'istruzione DDL CREATE VIEW per assegnare un nome alla vista e fornire la query che la definisce. Questa istruzione ha due forme:

  • CREATE VIEW definisce una nuova vista nel database corrente. Se esiste già una vista denominata view_name, l'istruzione CREATE VIEW non riesce.

  • CREATE OR REPLACE VIEW definisce una nuova vista nel database corrente. Se esiste già una vista denominata view_name, la sua definizione viene sostituita.

La sintassi dell'istruzione CREATE VIEW è la seguente:

{CREATE | CREATE OR REPLACE } VIEW  view_name
SQL SECURITY { INVOKER | DEFINER }
AS query

Poiché una vista è una tabella virtuale, la query che specifichi deve fornire i nomi di tutte le colonne di quella tabella virtuale.

Inoltre, Spanner controlla la query che specifichi utilizzando la risoluzione dei nomi rigorosa, il che significa che tutti i nomi degli oggetti schema utilizzati nella query devono essere qualificati in modo da identificare in modo univoco un singolo oggetto schema. Ad esempio, negli esempi che seguono la SingerId colonna nella Singers tabella deve essere qualificata come Singers.SingerId.

Devi specificare SQL SECURITY come INVOKER o DEFINER nell'istruzione CREATE VIEW o CREATE OR REPLACE VIEW. Per saperne di più sulla differenza tra i due tipi di sicurezza, consulta la Panoramica delle viste.

Ad esempio, supponiamo che la tabella Singers sia definita come mostrato di seguito:

GoogleSQL

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX)
) PRIMARY KEY (SingerId);

PostgreSQL

CREATE TABLE Singers (
  SingerId   BIGINT PRIMARY KEY,
  FirstName  VARCHAR(1024),
  LastName   VARCHAR(1024),
  SingerInfo BYTEA
);

Puoi definire la vista SingerNames con i diritti dell'invocatore come mostrato di seguito:

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

La tabella virtuale creata quando la vista SingerNames viene utilizzata in una query ha due colonne, SingerId e Name.

Sebbene questa definizione della vista SingerNames sia valida, non rispetta la best practice di eseguire il cast dei tipi di dati per garantire la stabilità tra le modifiche dello schema, come descritto nella sezione successiva.

Best practice per la creazione di viste

Per ridurre al minimo la necessità di aggiornare la definizione di una vista, esegui il cast esplicito del tipo di dati di tutte le colonne della tabella nella query che definisce la vista. In questo modo, la definizione della vista può rimanere valida tra le modifiche dello schema al tipo di una colonna.

Ad esempio, la seguente definizione della vista SingerNames potrebbe diventare non valida a seguito della modifica del tipo di dati di una colonna nella tabella Singers.

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

Puoi evitare che la vista diventi non valida eseguendo il cast esplicito delle colonne ai tipi di dati necessari, come mostrato nell'esempio seguente:

GoogleSQL

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
 CAST(Singers.SingerId AS INT64) AS SingerId,
 CAST(Singers.FirstName AS STRING) || " " || CAST(Singers.LastName AS STRING) AS Name
FROM Singers;

PostgreSQL

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY INVOKER
AS SELECT
 CAST(Singers.SingerId AS bigint) AS SingerId,
 CAST(Singers.FirstName AS varchar) || ' ' || CAST(Singers.LastName AS varchar) AS Name
FROM Singers;

Concedi e revoca l'accesso a una vista

In qualità di utente del controllo dell'accesso granulare, devi disporre del privilegio SELECT su una vista. Per concedere il privilegio SELECT su una vista a un ruolo del database:

GoogleSQL

GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;

PostgreSQL

GRANT SELECT ON TABLE SingerNames TO Analyst;

Per revocare il privilegio SELECT su una vista da un ruolo del database:

GoogleSQL

REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;

PostgreSQL

REVOKE SELECT ON TABLE SingerNames FROM Analyst;

Esegui query su una vista

Il modo per eseguire query su una vista con i diritti dell'invocatore o con i diritti del definer è lo stesso. Tuttavia, a seconda del tipo di sicurezza della vista, Spanner potrebbe dover controllare o meno gli oggetti schema a cui fa riferimento la vista rispetto al ruolo del database dell'entità che ha richiamato la query.

Esegui query su una vista con i diritti dell'invocatore

Se una vista ha i diritti dell'invocatore, l'utente deve disporre dei privilegi su tutti gli oggetti schema sottostanti della vista per poter eseguire query su di essa.

Ad esempio, se un ruolo del database ha accesso a tutti gli oggetti a cui fa riferimento la vista SingerNames, può eseguire query sulla vista SingerNames:

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

Esegui query su una vista con i diritti del definer

Se una vista ha i diritti del definer, un utente può eseguire query sulla vista senza aver bisogno di privilegi sugli oggetti sottostanti, a condizione che tu conceda al ruolo richiesto il privilegio SELECT sulla vista.

Nell'esempio seguente, un utente con il ruolo del database Analyst vuole eseguire query sulla vista SingerNames. Tuttavia, all'utente viene negato l'accesso perché SingerNames è una vista con i diritti dell'invocatore e il ruolo Analyst non ha accesso a tutti gli oggetti sottostanti. In questo caso, se decidi di fornire all'analista l'accesso alla vista, ma non vuoi fornirgli l'accesso alla Singers tabella, puoi sostituire il tipo di sicurezza della vista con i diritti del definer. Dopo aver sostituito il tipo di sicurezza della vista, concedi al ruolo Analyst l'accesso alla vista. L'utente ora può eseguire query sulla vista SingerNames anche se non ha accesso alla tabella Singers.

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

Sostituisci una vista

Puoi sostituire una vista utilizzando l'istruzione CREATE OR REPLACE VIEW per modificare la definizione della vista o il tipo di sicurezza della vista.

La sostituzione di una vista è simile all'eliminazione e alla ricreazione della vista. Le concessioni di accesso alla vista iniziale devono essere concesse di nuovo dopo la sostituzione della vista.

Per sostituire una vista con i diritti dell'invocatore con una vista con i diritti del definer:

CREATE OR REPLACE VIEW SingerNames
SQL SECURITY DEFINER
AS SELECT
   Singers.SingerId AS SingerId,
   Singers.FirstName || ' ' || Singers.LastName AS Name
FROM Singers;

Elimina una vista

Dopo l'eliminazione di una vista, i ruoli del database con privilegi su di essa non hanno più accesso. Per eliminare una vista, utilizza l'istruzione DROP VIEW.

DROP VIEW SingerNames;

Ottieni informazioni su una vista

Puoi ottenere informazioni sulle viste in un database eseguendo query sulle tabelle nel relativo schema INFORMATION_SCHEMA.

  • La tabella INFORMATION_SCHEMA.TABLES fornisce i nomi di tutte le viste definite.

  • La tabella INFORMATION_SCHEMA.VIEWS fornisce i nomi, la definizione della vista, il tipo di sicurezza e il testo della query di tutte le viste definite. Gli utenti FGAC che dispongono del privilegio SELECT sulla vista possono ottenere informazioni sulla vista dalla tabella INFORMATION_SCHEMA.VIEWS. Gli altri utenti FGAC hanno bisogno del ruolo spanner_info_reader se non dispongono del privilegio SELECT per la vista.

Per controllare la definizione della vista e il tipo di sicurezza di una vista denominata ProductSoldLastWeek:

  SELECT *
  FROM INFORMATION_SCHEMA.VIEWS
  WHERE TABLE_NAME = 'ProductSoldLastWeek';