Ansichten erstellen und verwalten

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

Berechtigungen

Zum Erstellen, Gewähren und Widerrufen des Zugriffs auf eine Ansicht benötigen Sie die Berechtigung spanner.database.updateDdl.

Ansicht erstellen

Verwenden Sie zum Erstellen einer Ansicht die DDL-Anweisung CREATE VIEW, um die Ansicht zu benennen und die Abfrage anzugeben, die sie definiert. Diese Anweisung 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 eine Ansicht eine virtuelle Tabelle ist, muss der von Ihnen angegebene query Namen für alle Spalten in dieser virtuellen Tabelle bereitstellen.

Außerdem prüft Spanner die von Ihnen angegebene query mit einer 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 Anweisung CREATE VIEW oder CREATE OR REPLACE VIEW als INVOKER oder DEFINER angeben. Weitere Informationen zum Unterschied zwischen den beiden Sicherheitstypen finden Sie unter Informationen zu Ansichten.

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 erstellt wird, wenn die Ansicht SingerNames in einer Abfrage verwendet 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 Ansichten

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.

Beispielsweise kann die folgende Definition der Ansicht SingerNames ungültig werden, wenn der Datentyp einer Spalte in der Tabelle Singers geändert wird.

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 wie folgt explizit in die gewünschten Datentypen umwandeln:

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 aufheben

Als Nutzer einer detaillierten Zugriffssteuerung benötigen Sie die Berechtigung SELECT für eine Datenansicht. 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;

Datenansicht abfragen

Die Möglichkeit, die Rechte eines Aufrufers oder die Rechte eines Defenders abzufragen, ist die gleiche. Je nach Sicherheitstyp der Ansicht kann Spanner die Schemaobjekte, auf die in der Ansicht verwiesen wird, mit der Datenbankrolle des Hauptkontos vergleichen, das die Abfrage aufgerufen hat.

Ansicht der Rechte eines Aufrufers abfragen

Wenn eine Ansicht über Invoker-Rechte verfügt, muss der Nutzer Berechtigungen für alle zugrunde liegenden Schemaobjekte der Ansicht haben, um die Ansicht abfragen zu können.

Wenn beispielsweise eine Datenbankrolle Zugriff auf alle Objekte hat, auf die in der Ansicht SingerNames verwiesen wird, kann sie die Ansicht SingerNames abfragen:

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

Ansicht der Rechte eines Definierenden abfragen

Wenn eine Ansicht über Definitionsrechte verfügt, kann ein Nutzer die Ansicht abfragen, ohne dass Berechtigungen für die zugrunde liegenden Objekte erforderlich sind. Voraussetzung dafür ist, dass Sie der erforderlichen Rolle die Berechtigung SELECT für die Ansicht zuweisen.

Im folgenden Beispiel möchte ein Nutzer mit der Datenbankrolle „Analyst“ die Ansicht SingerNames abfragen. Der Zugriff wird jedoch verweigert, da SingerNames die Rechteansicht eines Aufrufers ist und die Rolle „Analyst“ nicht auf alle zugrunde liegenden Objekte zugreifen kann. Wenn Sie dem Analysten in diesem Fall Zugriff auf die Ansicht gewähren, ihm aber keinen Zugriff auf die Tabelle Singers gewähren möchten, können Sie den Sicherheitstyp der Ansicht ersetzen, um die Rechte des Analysten zu bestimmen. Nachdem Sie den Sicherheitstyp der Ansicht ersetzt haben, gewähren Sie der Analystenrolle Zugriff auf die Ansicht. Der Nutzer kann jetzt die Ansicht SingerNames abfragen, obwohl er keinen Zugriff auf die Tabelle Singers hat.

SELECT COUNT(SingerID) as SingerCount
FROM SingerNames;

Ansicht ersetzen

Sie können eine Ansicht ersetzen, indem Sie die CREATE OR REPLACE VIEW-Anweisung verwenden, um die Ansichtsdefinition oder den Sicherheitstyp der Ansicht zu ändern.

Das Ersetzen einer Ansicht ist vergleichbar mit dem Löschen und Neuerstellen der Ansicht. Alle Zugriffsberechtigungen, die der ersten Ansicht zugewiesen wurden, müssen nach dem Ersetzen der Ansicht noch einmal gewährt werden.

So ersetzen Sie die Rechteansicht eines Aufrufers durch die Ansicht der Rechte eines Defenders:

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 dafür keinen Zugriff mehr. Verwenden Sie die DROP VIEW-Anweisung, 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 in ihrem INFORMATION_SCHEMA-Schema abfragen.

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

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

So prüfen Sie die Ansichtsdefinition und den Sicherheitstyp einer Ansicht namens ProductSoldLastWeek:

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