Auf dieser Seite wird beschrieben, wie Sie Spanner-Ansichten erstellen und verwalten. Weitere Informationen zu Spanner-Ansichten finden Sie unter 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 zum Erstellen einer Ansicht die DDL-Anweisung CREATE VIEW
, um der Ansicht einen Namen zu geben und die Abfrage anzugeben, die sie definiert. Diese Aussage hat zwei Formen:
CREATE VIEW
definiert eine neue Tabelle in der aktuellen Datenbank. Wenn eine Ansicht mit dem Namenview_name
bereits vorhanden ist, schlägt die AnweisungCREATE VIEW
fehl.CREATE OR REPLACE VIEW
definiert eine neue Tabelle in der aktuellen Datenbank. Wenn eine Ansicht mit dem Namenview_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 die von Ihnen angegebene query
Namen für alle Spalten in dieser virtuellen Tabelle angeben.
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 den Unterschieden zwischen den beiden Sicherheitstypen finden Sie unter Über 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 Berechtigungen 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.
Die folgende Definition der Ansicht SingerNames
könnte beispielsweise 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 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 SELECT
-Berechtigung 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 SELECT
-Berechtigung für eine Ansicht für eine 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 der Rechteansicht eines Definierers erfolgt auf die gleiche Weise. 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.
Ansicht der Berechtigungen eines Aufrufers abfragen
Wenn eine Ansicht die Rechte des Aufrufers hat, muss der Nutzer Berechtigungen für alle zugrunde liegenden Schemaobjekte der Ansicht haben, um sie abzufragen.
Wenn eine Datenbankrolle beispielsweise Zugriff auf alle Objekte hat, auf die in der SingerNames
-Ansicht verwiesen wird, kann sie die SingerNames
-Ansicht abfragen:
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Rechteansicht eines Definierers abfragen
Wenn für eine Datenansicht die Rechte des Erstellers festgelegt sind, kann ein Nutzer die Datenansicht abfragen, ohne Berechtigungen für die zugrunde liegenden Objekte zu benötigen. Voraussetzung ist, dass Sie der erforderlichen Rolle die Berechtigung SELECT
für die Datenansicht zuweisen.
Im folgenden Beispiel möchte ein Nutzer mit der Datenbankrolle „Analyst“ die Ansicht SingerNames
abfragen. Dem Nutzer wird jedoch der Zugriff verweigert, da SingerNames
die Rechteansicht eines Aufrufers ist und die Rolle „Analyst“ keinen Zugriff auf alle zugrunde liegenden Objekte hat. 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 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 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 BerechtigungSELECT
für die Datenansicht können Informationen zur Datenansicht aus der TabelleINFORMATION_SCHEMA.VIEWS
abrufen. Andere FGAC-Nutzer benötigen die Rollespanner_info_reader
, wenn sie nicht die BerechtigungSELECT
für die Datenansicht haben.
So prüfen Sie die Definition und den Sicherheitstyp einer Ansicht namens ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';