In diesem Dokument werden Spanner-Ansichten vorgestellt und beschrieben.
Übersicht
Eine Ansicht ist eine virtuelle Tabelle, die durch eine SQL-Abfrage definiert wird. Wenn Sie eine Ansicht erstellen, geben Sie die SQL-Abfrage an, die sie darstellt. Nachdem Sie eine Ansicht erstellt haben, können Sie Abfragen ausführen, die sich auf die Ansicht beziehen, als wäre sie eine Tabelle.
Wenn eine Abfrage ausgeführt wird, die auf eine Ansicht verweist, erstellt Spanner die virtuelle Tabelle, indem die in der Ansicht definierte Abfrage ausgeführt wird und der Inhalt dieser virtuellen Tabelle wird von der verweisenden Abfrage verwendet.
Da die Abfrage, die eine Ansicht definiert, jedes Mal ausgeführt wird, wenn eine Abfrage, die sich auf die Ansicht bezieht, ausgeführt wird, werden Ansichten manchmal auch als logische Ansichten oder dynamische Ansichten bezeichnet, um sie von materialisierten SQL-Ansichten zu unterscheiden, in denen die Ergebnisse der Abfrage, die die Ansicht definiert, als tatsächliche Tabelle im Datenspeicher gespeichert werden.
In Spanner können Sie eine Ansicht entweder als Ansicht mit Aufruferrechten oder als Ansicht mit Definierrechten erstellen. Das sind die beiden Arten von Sicherheitsmodellen, mit denen der Zugriff von Nutzern auf eine Ansicht gesteuert wird.
Ansichten der Rechte des Aufrufers | Ansichten der Rechte des Definierten | |
---|---|---|
Beschreibung | Wenn Sie eine Ansicht mit den Rechten des Aufrufers erstellen, benötigt eine Datenbankrolle Berechtigungen für die Ansicht und alle Schemaobjekte, auf die die Ansicht verweist, um die Ansicht abzufragen. Weitere Informationen finden Sie unter Ansichten mit Rechten des Aufrufers. | Wenn Sie eine Ansicht mit den Rechten des Definers erstellen, benötigt eine Datenbankrolle Berechtigungen für die Ansicht (und nur für die Ansicht), um die Ansicht abzufragen. Verwenden Sie die detaillierte Zugriffssteuerung zusammen mit der Ansicht „Rechte des Definierers“. Andernfalls bietet die Ansicht „Rechte des Definierers“ keine zusätzliche Zugriffssteuerung. Weitere Informationen finden Sie unter Ansichten mit den Rechten des Definers. |
Erforderliche Berechtigungen zum Erstellen der Ansicht | Zum Erstellen, Gewähren und Widerrufen des Zugriffs auf einen der beiden Ansichtstypen benötigen Sie die Berechtigung spanner.database.updateDdl auf Datenbankebene. |
|
Erforderliche Berechtigungen zum Abfragen der Ansicht | Eine Datenbankrolle benötigt Berechtigungen für die Ansicht und alle zugrunde liegenden Schemaobjekte, um die Ansicht abzufragen. | Eine Datenbankrolle benötigt Berechtigungen für die Ansicht (und nur für die Ansicht), um die Ansicht abzufragen. |
Vorteile von Aufrufen
Ansichten bieten mehrere Vorteile im Vergleich zum Einbeziehen der von ihnen definierten Abfragen in die Anwendungslogik.
Ansichten können für Anwendungen eine logische Datenmodellierung bieten.
Manchmal sind die Entscheidungen, die für die physische Datenmodellierung in Spanner sinnvoll sind, nicht die beste Abstraktion für Anwendungen, die diese Daten lesen. In einer Ansicht kann ein alternatives Tabellenschema dargestellt werden, das eine angemessenere Abstraktion für Anwendungen ist.
In Ansichten sind Abfragedefinitionen zentralisiert, was die Wartung vereinfacht.
Durch das Erstellen von Ansichten für häufig verwendete oder komplexe Abfragen können Sie Abfragetext aus Anwendungen ausklammern und zentralisieren. Dadurch ist es einfacher, Abfragetext über mehrere Anwendungen hinweg auf dem neuesten Stand zu halten und Abfragen können überarbeitet und optimiert werden, ohne dass sich der Anwendungscode ändern muss.
Ansichten bieten Stabilität über Schemaänderungen hinweg.
Da die Abfrage, die eine Ansicht definiert, im Datenbankschema statt in der Anwendungslogik gespeichert wird, kann und wird Spanner dafür sorgen, dass Schemaänderungen an den Objekten (Tabellen, Spalten usw.), auf die sich die Abfrage bezieht, die Abfrage nicht ungültig machen.
Gängige Anwendungsfälle
Verwenden Sie Ansichten, wenn Ihre Spanner-Datenbank Daten mit hohen Berechtigungen enthält, die nicht für alle Datenbanknutzer verfügbar sein sollten, oder wenn Sie Ihre Daten kapseln möchten.
Wenn für Ihre Ansicht keine zusätzlichen Sicherheitsfunktionen erforderlich sind und alle Aufrufer der Ansicht Zugriff auf alle Schemaobjekte haben, auf die die Ansicht verweist, erstellen Sie eine Ansicht mit Aufruferrechten.
Wenn Sie eine Ansicht erstellen möchten, in der nicht alle Aufrufer Zugriff auf alle Schemaobjekte haben, auf die die Ansicht verweist, erstellen Sie eine Ansicht mit Definer-Rechten. Ansichten mit Definer-Rechten sind besser geschützt und unterliegen mehr Einschränkungen, da der Datenbankadministrator weniger Nutzern Berechtigungen für die in der Ansicht referenzierten Tabellen und Spalten erteilen kann. Ansichten mit den Rechten des Definierers sind nützlich, wenn ein Nutzer sicher auf eine relevante Teilmenge einer Spanner-Datenbank zugreifen muss. Sie möchten beispielsweise eine Ansicht mit den Rechten des Definierers für die folgenden Daten erstellen:
- Personenbezogene Kontodaten (z.B. Anwendungsnutzer).
- Rollenspezifische Daten (z.B. HR-Mitarbeiter, Vertriebsmitarbeiter).
- Standortspezifische Daten.
Ansichten der Rechte des Aufrufers
Wenn eine Ansicht die Rechte des Aufrufers hat, prüft Spanner, wenn ein Nutzer (der Aufrufer) eine Abfrage für die Ansicht ausführt, die Berechtigungen des Nutzers für die Ansicht und für alle Schemaobjekte, auf die die Ansicht verweist. Der Nutzer muss Berechtigungen für alle Schemaobjekte haben, um die Ansicht abzufragen.
Ansichten der Rechte des Definierten
Die Ansicht „Rechte des Definers“ bietet zusätzliche Sicherheitsfunktionen. Sie bietet unterschiedliche Berechtigungen für die Ansicht und die zugrunde liegenden Schemaobjekte. Wie bei Ansichten mit den Rechten des Aufrufers müssen Nutzer Berechtigungen auf Datenbankebene haben, um Ansichten mit den Rechten des Definierers zu erstellen. Der Hauptunterschied besteht darin, dass Spanner bei einer Datenbankrolle, die eine Ansicht mit den Rechten des Definierers abfragt, prüft, ob die Rolle Zugriff auf die Ansicht selbst (und nur auf die Ansicht) hat. Auch wenn der Nutzer, der die Ansicht abfragt, keinen Zugriff auf alle zugrunde liegenden Schemaobjekte hat, kann er auf die Ansicht zugreifen und deren Inhalt sehen. Mit Ansichten mit Definer-Rechten haben Nutzer Zugriff auf aktuelle Daten, die auf die in der Ansicht definierten Zeilen beschränkt sind.
Spanner-IAM-Berechtigungen (Identity and Access Management) werden auf Datenbankebene gewährt. Verwenden Sie die detaillierte Zugriffssteuerung zusammen mit der Ansicht „Rechte des Definierers“. Andernfalls bietet die Ansicht „Rechte des Definierers“ keine zusätzliche Zugriffssteuerung. Das liegt daran, dass der Nutzer, wenn er Leseberechtigungen für die Datenbank hat, auch Leseberechtigungen für alle Schemaobjekte in der Datenbank hat. Nachdem Sie die detaillierte Zugriffssteuerung für Ihre Datenbank konfiguriert haben, können Nutzer mit detaillierter Zugriffssteuerung und der Berechtigung SELECT
für die Ansicht sowie Nutzer mit Berechtigungen auf Datenbankebene für die Datenbank die Ansicht abfragen. Der Unterschied besteht darin, dass der Nutzer der detaillierten Zugriffssteuerung keine Berechtigungen für die zugrunde liegenden Objekte benötigt.
Einschränkungen von Ansichten
Ansichten haben im Vergleich zu tatsächlichen Tabellen Einschränkungen, sodass sie für bestimmte Anwendungsfälle nicht geeignet sind.
Ansichten sind schreibgeschützt. Sie können nicht verwendet werden, um Daten hinzuzufügen, zu aktualisieren oder zu löschen.
In DML-Anweisungen (
INSERT
,UPDATE
,DELETE
) können keine Ansichten verwendet werden.Bei einer Abfrage, die eine Ansicht definiert, können keine Abfrageparameter verwendet werden.
Ansichten können nicht indexiert werden.
Bei Verweisen auf Ansichten können keine Tabellenhinweise verwendet werden.
Die Abfrage, die eine Ansicht definiert, kann jedoch Tabellenhinweise für die Tabellen enthalten, auf die sie verweist.
Ansichten werden von der Read API nicht unterstützt.
Ansichten mit den Rechten des Definierers werden in Spanner Data Boost nicht unterstützt.
Das Ausführen einer Abfrage, die eine Ansicht mit den Rechten des Definierers in Data Boost enthält, führt zu einem Fehler.
Der empfohlene Abfragemodus für den Zugriff auf die Ansicht der Rechte eines Rechteinhabers ist der Modus
NORMAL
.Nutzer, die keinen Zugriff auf die zugrunde liegenden Schemaobjekte einer Ansicht mit Definerrechten haben, erhalten eine Fehlermeldung, wenn sie in einem anderen Abfragemodus als „normal“ abfragen.
Ein Nutzer kann eine sorgfältig ausgearbeitete Abfrage erstellen, die dazu führt, dass Spanner einen Fehler ausgibt, der die Existenz von Daten zeigt oder offenbart, die in der Ansicht mit den Rechten des Definierers nicht verfügbar sind.
Angenommen, es gibt die folgende Ansicht „QualifiedStudentScores“, die die Ergebnisse von Schülern zurückgibt, die sich für einen Kurs qualifizieren. Die Kriterien für die Qualifizierung basieren auf dem Niveau und der Prüfungsnote des Schülers. Wenn das Niveau des Schülers oder Studenten gleich oder niedriger als sechs ist, ist die Punktzahl wichtig und der Schüler oder Student muss mindestens 50 Punkte in der Prüfung erreichen, um sich zu qualifizieren. Andernfalls qualifizieren sich Schüler/Studenten für Stufen ab 6 standardmäßig.
CREATE VIEW QualifiedStudentScores SQL SECURITY DEFINER AS SELECT s.Name, s.Level, sc.Score FROM Students AS s JOIN Scores AS sc ON sc.StudentId = s.StudentId WHERE (CASE WHEN (s.Level < 6) OR (s.Level >= 6 AND sc.Score >= 50) THEN 'QUALIFIED'; ELSE 'FAILED'; END) = 'QUALIFIED';
Ein Nutzer kann eine Abfrage in der Form
SELECT * FROM QualifiedStudentScores s WHERE s.Level = 7 AND 1/(s.Score - 20) = 1;
ausführen. Diese Abfrage kann mit einem Fehler aufgrund von Division durch null fehlschlagen, wenn es einen Schüler/Studenten in Klasse 7 gibt, der 20 Punkte erreicht hat, obwohl die Daten in der Ansicht für diese Klasse auf 50 Punkte und mehr begrenzt sind.
Abfrageleistung bei der Verwendung von Ansichten
Die Leistung einer Abfrage, die auf eine Ansicht verweist, ist vergleichbar mit derselben Abfrage, wenn deren Ansichtsverweis durch die Ansichtsdefinition ersetzt wird.
Kontingente und Limits für Ansichten
Auf der Seite Kontingente und Limits sind Kontingent- und Limitinformationen speziell für Ansichten aufgelistet.
Die Verwendung einer Ansicht in einer Abfrage kann die Konformität der Abfrage mit Abfragelimits beeinträchtigen, da die Definition der Ansicht Teil der Abfrage wird.
Auswirkungen auf die Kosten
Die Verwendung von Ansichten hat einen sehr geringen Einfluss auf die Kosten einer Instanz:
Die Verwendung von Ansichten hat keinen Einfluss auf die Anforderungen einer Instanz an die Rechenkapazität, im Vergleich zur Einbettung ihres definierten Abfragetextes in Abfragen, die sich auf sie beziehen.
Die Verwendung von Ansichten hat einen sehr kleinen Einfluss auf den Datenbankspeicher einer Instanz, da die durch das Ausführen der Abfragedefinition einer Ansicht generierte Tabelle nicht im nichtflüchtigen Datenbankspeicher gespeichert wird.