Ansichten erstellen und verwalten

Auf dieser Seite wird beschrieben, wie Sie Spanner-Ansichten erstellen und verwalten. Weitere Informationen Informationen zu Spanner-Ansichten finden Sie unter Informationen zu Ansichten.

Berechtigungen

Sie benötigen die Berechtigung spanner.database.updateDdl, um Zugriff auf eine Ansicht zu erstellen, zu gewähren und zu widerrufen.

Ansicht erstellen

Verwenden Sie die DDL-Anweisung, um eine Ansicht zu erstellen CREATE VIEW zum Benennen des die Abfrage, durch die sie definiert wird, angeben und anzeigen. Diese Aussage hat zwei Formen:

  • CREATE VIEW definiert eine neue Tabelle in der aktuellen Datenbank. Wenn eine Ansicht mit dem Namen view_name bereits vorhanden ist, schlägt die Anweisung CREATE VIEW fehl.

  • CREATE OR REPLACE VIEW definiert eine neue Tabelle in der aktuellen Datenbank. Wenn eine Ansicht mit dem Namen view_name bereits vorhanden ist, wird ihre Definition ersetzt.

Die Syntax für die Anweisung CREATE VIEW lautet:

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

Da es sich bei einer Ansicht um eine virtuelle Tabelle handelt, ist die query, die Sie müssen Namen für alle Spalten in dieser virtuellen Tabelle bereitgestellt werden.

Darüber hinaus prüft Spanner die query, die Sie angeben, mit der strikten Namensauflösung. Das bedeutet, dass alle in der Abfrage verwendeten Schemaobjektnamen so qualifiziert sein müssen, dass sie ein einzelnes Schemaobjekt eindeutig identifizieren. Beispielsweise müssen die Beispiele, die auf die Spalte SingerId in der Tabelle Singers folgen, als Singers.SingerId qualifiziert sein.

Sie müssen SQL SECURITY in der CREATE VIEW- oder CREATE OR REPLACE VIEW-Anweisung als INVOKER oder DEFINER angeben. Weitere Informationen zu Informationen zum Unterschied zwischen den beiden Sicherheitstypen finden Sie im Hilfeartikel Datenansichten.

Angenommen, die Tabelle Singers ist so definiert:

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
);

Sie können die Ansicht SingerNames mit den Rechten des Aufrufers so definieren:

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

Die virtuelle Tabelle, die beim Verwenden der Ansicht SingerNames in einer Abfrage erstellt wird, hat zwei Spalten: SingerId und Name.

Diese Definition der Ansicht SingerNames ist zwar gültig, entspricht jedoch nicht der Best Practice für die Umwandlung von Datentypen zur Gewährleistung der Stabilität bei Schemaänderungen, wie im nächsten Abschnitt beschrieben.

Best Practices für das Erstellen von Datenansichten

Um die Notwendigkeit zu minimieren, die Definition einer Ansicht zu aktualisieren, müssen Sie den Datentyp aller Tabellenspalten in der Abfrage, die die Ansicht definiert, explizit umwandeln. Wenn Sie das tun, kann die Definition der Ansicht während Schemaänderungen am Spaltentyp gültig bleiben.

So könnte beispielsweise die folgende Definition der Ansicht SingerNames zu ungültig als Ergebnis der Änderung des Datentyps einer Spalte in der Tabelle Singers.

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

Sie können verhindern, dass die Ansicht ungültig wird, indem Sie die Spalten explizit in die gewünschten Datentypen umwandeln, wie im Folgenden gezeigt:

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;

Zugriff auf eine Ansicht gewähren und widerrufen

Als Nutzer mit detaillierter Zugriffssteuerung benötigen Sie die Berechtigung SELECT für eine Ansicht. So gewähren Sie einer Datenbankrolle die Berechtigung SELECT für eine Ansicht:

GoogleSQL

GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;

PostgreSQL

GRANT SELECT ON TABLE SingerNames TO Analyst;

So widerrufen Sie die Berechtigung SELECT für eine Ansicht aus einer Datenbankrolle:

GoogleSQL

REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;

PostgreSQL

REVOKE SELECT ON TABLE SingerNames FROM Analyst;

Ansicht abfragen

Die Abfrage der Rechte eines Aufrufers oder einer Definition für die Rechte einer Definition lässt sich auf dieselbe Weise abfragen. Je nach Sicherheitstyp der Ansicht muss Spanner die in der Ansicht referenzierten Schemaobjekte jedoch möglicherweise nicht mit der Datenbankrolle des Principals vergleichen, der die Abfrage aufgerufen hat.

Rechteansicht eines Aufrufers abfragen

Wenn eine Ansicht die Rechte eines Aufrufers hat, muss der Nutzer Berechtigungen für alle zugrunde liegenden Schema-Objekte der Ansicht erstellen, um sie abzufragen.

Wenn beispielsweise eine Datenbankrolle Zugriff auf alle Objekte hat, auf die im SingerNames-Ansicht können sie die SingerNames-Ansicht abfragen:

SELECT COUNT(SingerID) as SingerCount 
FROM SingerNames;

Rechteansicht eines Definitionstellers abfragen

Wenn eine Ansicht über die Rechte eines Definierens verfügt, kann ein Nutzer die Ansicht abfragen, ohne dass Berechtigungen für die zugrunde liegenden Objekte, solange Sie die erforderliche Rolle SELECT Berechtigung für die Datenansicht.

Im folgenden Beispiel möchte ein Nutzer mit der Datenbankrolle „Analyst“ Ansicht SingerNames Der Zugriff wird dem Nutzer jedoch aus folgendem Grund verweigert: SingerNames ist die Rechteansicht eines Aufrufers und die Rolle „Analyst“ hat keinen Zugriff auf alle zugrunde liegende Objekte. Wenn Sie dem Analysten in diesem Fall Zugriff auf die Datenansicht, aber keinen Zugriff auf die Tabelle Singers gewähren möchten, können Sie die Sicherheitseinstellungen der Datenansicht ändern, um die Berechtigungen des Nutzers festzulegen. Nachdem Sie den Sicherheitstyp der Ansicht ersetzt haben, gewähren Sie der Rolle „Analyst“ Zugriff auf die Ansicht. Der Nutzer kann jetzt die Ansicht SingerNames abfragen auch wenn sie keinen Zugriff auf die Tabelle Singers haben.

SELECT COUNT(SingerID) as SingerCount 
FROM SingerNames;

Ansicht ersetzen

Sie können eine Ansicht ersetzen, indem Sie mit der Anweisung CREATE OR REPLACE VIEW die Definition oder den Sicherheitstyp der Ansicht ändern.

Das Ersetzen einer Ansicht ähnelt dem Löschen und Neuerstellen der Ansicht. Alle Zugriffsberechtigungen, die der ursprünglichen Ansicht gewährt wurden, müssen nach dem Ersetzen der Ansicht neu gewährt werden.

So ersetzen Sie die Rechteansicht eines Aufrufers durch die Rechteansicht eines Definierers:

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

Ansicht löschen

Nachdem eine Ansicht gelöscht wurde, haben Datenbankrollen mit Berechtigungen für diese Ansicht keinen Zugriff mehr. Verwenden Sie die Anweisung DROP VIEW, um eine Ansicht zu löschen.

DROP VIEW SingerNames;

Informationen zu einer Ansicht abrufen

Sie können Informationen zu Ansichten in einer Datenbank abrufen, indem Sie Tabellen im Schema INFORMATION_SCHEMA abfragen.

  • Die Tabelle INFORMATION_SCHEMA.TABLES enthält die Namen aller definierten Ansichten.

  • Die Tabelle INFORMATION_SCHEMA.VIEWS enthält die Namen, die Definition der Ansicht, den Sicherheitstyp und den Abfragetext aller definierten Ansichten. FGAC-Nutzer mit der Berechtigung SELECT für die Datenansicht können Informationen zur Datenansicht aus der Tabelle INFORMATION_SCHEMA.VIEWS abrufen. Andere FGAC-Nutzer benötigen die Rolle spanner_info_reader, falls sie nicht SELECT Berechtigung für die Datenansicht.

Um die Definition der Datenansicht und den Sicherheitstyp einer Ansicht mit dem Namen ProductSoldLastWeek:

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