Auf dieser Seite wird beschrieben, wie Sie Cloud Spanner-Ansichten für Datenbanken im GoogleSQL-Dialekt und Datenbanken im PostgreSQL-Dialekt erstellen und verwalten. Weitere Informationen zu Spanner-Ansichten finden Sie unter Ansichten – Übersicht.
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 VIEWdefiniert eine neue Tabelle in der aktuellen Datenbank. Wenn eine Ansicht mit dem Namenview_namebereits vorhanden ist, schlägt die AnweisungCREATE VIEWfehl.CREATE OR REPLACE VIEWdefiniert eine neue Tabelle in der aktuellen Datenbank. Wenn eine Ansicht mit dem Namenview_namebereits 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, müssen Sie in der von Ihnen angegebenen query Namen für alle Spalten in dieser virtuellen Tabelle angeben.
Darüber hinaus prüft Spanner die von Ihnen angegebene query mithilfe 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 entweder als INVOKER oder als DEFINER angeben. Weitere Informationen zum Unterschied zwischen den beiden Sicherheitstypen finden Sie unter Ansichten – Übersicht.
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.
Parametrisierte Ansicht erstellen
Wenn Sie parametrisierte Ansichten erstellen möchten, fügen Sie die Funktion SECURE_CONTEXT() in die WHERE-Klausel der SELECT-Anweisung ein.
Im folgenden Beispiel gewährt die parametrisierte Ansicht dem Anwendungsnutzer Zugriff auf die Spalten SingerId, FirstName und LastName aus der Tabelle Singers. In der Ansicht werden die Ergebnisse auf Zeilen beschränkt, in denen UserID mit dem erforderlichen Parameter app_end_userid übereinstimmt.
CREATE VIEW SingerNames SQL SECURITY DEFINER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers WHERE UserID = CAST(SECURE_CONTEXT('app_end_userid'), INT64);
Wenn Sie die parametrisierte Ansicht verwenden möchten, benötigen Sie die Berechtigung SELECT für eine Ansicht. Weitere Informationen finden Sie unter Zugriff auf eine Ansicht gewähren und widerrufen.
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 explizit in die erforderlichen Datentypen umwandeln, wie im folgenden Beispiel 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 entziehen Sie einer Datenbankrolle die Berechtigung SELECT für eine Ansicht:
GoogleSQL
REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;
PostgreSQL
REVOKE SELECT ON TABLE SingerNames FROM Analyst;
Ansicht abfragen
Die Abfrage einer Ansicht mit Aufruferrechten oder einer Ansicht mit Erstellerrechten ist identisch. Je nach Sicherheitstyp der Ansicht muss Spanner jedoch möglicherweise die in der Ansicht referenzierten Schemaobjekte mit der Datenbankrolle des Hauptkontos abgleichen, das die Abfrage aufgerufen hat.
Ansicht mit Aufruferrechten abfragen
Wenn eine Ansicht Aufruferrechte hat, muss der Nutzer Berechtigungen für alle zugrunde liegenden Schemaobjekte der Ansicht haben, um sie abfragen zu können.
Wenn eine Datenbankrolle beispielsweise Zugriff auf alle Objekte hat, auf die die Ansicht SingerNames verweist, kann sie die Ansicht SingerNames abfragen:
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Ansicht mit den Rechten des Erstellers abfragen
Wenn eine Ansicht die Rechte des Erstellers hat, kann ein Nutzer die Ansicht abfragen, ohne Berechtigungen für die zugrunde liegenden Objekte zu benötigen, solange Sie der erforderlichen Rolle die Berechtigung SELECT für die Ansicht gewähren.
Im folgenden Beispiel möchte ein Nutzer mit der Datenbankrolle „Analyst“ die Ansicht SingerNames abfragen. Der Zugriff wird dem Nutzer jedoch verweigert, da SingerNames eine Ansicht mit Aufruferrechten ist und die Rolle „Analyst“ keinen Zugriff auf alle zugrunde liegenden Objekte hat. Wenn Sie dem Analysten Zugriff auf die Ansicht, aber nicht auf die Tabelle Singers gewähren möchten, können Sie den Sicherheitstyp der Ansicht durch die Rechte des Erstellers ersetzen. 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, obwohl er keinen Zugriff auf die Tabelle Singers hat.
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Parametrisierte Ansicht abfragen
Parametrisierte Ansichten werden wie andere Ansichten abgefragt. In der Ansicht werden Daten gefiltert, um den Kontext auf Anwendungsebene anhand der sicheren Parameter (z. B. Nutzer-ID) sicher zu übergeben.
Ansicht ersetzen
Sie können eine Ansicht mit der Anweisung CREATE OR REPLACE VIEW ersetzen, um die Ansichtsdefinition oder den Sicherheitstyp der Ansicht zu ändern.
Das Ersetzen einer Ansicht ähnelt dem Löschen und Neuerstellen der Ansicht. Alle Zugriffsberechtigungen, die für die ursprüngliche Ansicht gewährt wurden, müssen nach dem Ersetzen der Ansicht noch einmal gewährt werden.
So ersetzen Sie eine Ansicht mit Aufruferrechten durch eine Ansicht mit Erstellerrechten:
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
Informationen zu Ansichten in einer Datenbank erhalten Sie, indem Sie Tabellen im Schema INFORMATION_SCHEMA abfragen.
Die Tabelle
INFORMATION_SCHEMA.TABLESenthält die Namen aller definierten Ansichten.Die Tabelle
INFORMATION_SCHEMA.VIEWSenthält die Namen, die Ansichtsdefinition, den Sicherheitstyp und den Abfragetext aller definierten Ansichten. FGAC-Nutzer, die die BerechtigungSELECTfür die Ansicht haben, können Informationen zur Ansicht aus der TabelleINFORMATION_SCHEMA.VIEWSabrufen. Andere Nutzer mit detaillierter Zugriffssteuerung benötigen die Rollespanner_info_reader, wenn sie nicht die BerechtigungSELECTfür die Ansicht haben.
So prüfen Sie die Ansichtsdefinition und den Sicherheitstyp einer Ansicht mit dem Namen ProductSoldLastWeek:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';