Cette page explique comment créer et gérer des vues Spanner. Pour plus pour en savoir plus sur les vues Spanner, consultez la page À propos des vues.
Autorisations
Pour créer, accorder et révoquer l'accès à une vue, vous devez disposer du rôle
Autorisation spanner.database.updateDdl
.
Créer une vue
Pour créer une vue, utilisez l'instruction LDD
CREATE VIEW
pour nommer le
et fournissez la requête qui la définit. Cette instruction se présente sous deux formes:
CREATE VIEW
définit une nouvelle vue dans la base de données actuelle. Si une vue nomméeview_name
existe déjà, l'instructionCREATE VIEW
échoue.CREATE OR REPLACE VIEW
définit une nouvelle vue dans la base de données actuelle. Si une vue nomméeview_name
existe déjà, sa définition est remplacée.
La syntaxe de l'instruction CREATE VIEW est la suivante:
{CREATE | CREATE OR REPLACE } VIEW view_name SQL SECURITY { INVOKER | DEFINER } AS query
Étant donné qu'une vue est une table virtuelle, le query
que vous
spécifier doit fournir des noms pour toutes les colonnes de cette table virtuelle.
De plus, Spanner vérifie le query
que vous spécifiez en utilisant la résolution stricte des noms, ce qui signifie que tous les noms d'objets de schéma
utilisés dans la requête doivent être qualifiés de sorte qu'ils identifient sans ambiguïté
un objet à schéma unique. Par exemple, dans les exemples qui suivent la colonne SingerId
de la table Singers
doit être qualifiée en tant que Singers.SingerId
.
Vous devez spécifier la valeur de SQL SECURITY
soit INVOKER
, soit DEFINER
dans le champ
CREATE VIEW
ou CREATE OR REPLACE VIEW
. Pour en savoir plus sur
la différence entre les deux types de sécurité, consultez la section À propos des vues.
Par exemple, supposons que la table Singers
soit définie comme suit:
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 );
Vous pouvez définir la vue SingerNames
avec les droits du demandeur comme suit:
CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
La table virtuelle créée lorsque la vue SingerNames
est utilisée dans une requête contient deux colonnes, SingerId
et Name
.
Bien que cette définition de la vue SingerNames
soit valide, elle ne respecte pas les bonnes pratiques liées au casting de types de données afin de garantir la stabilité entre les modifications de schéma, comme décrit dans la section suivante.
Bonnes pratiques lors de la création de vues
Pour réduire la nécessité de mettre à jour la définition d'une vue, castez explicitement le type de données de toutes les colonnes de table dans la requête qui définit cette vue. Dans ce cas, la définition de la vue peut rester valide lors de toutes les modifications de schéma du type d'une colonne.
Par exemple, la définition suivante de la vue SingerNames
peut devenir
non valide en raison de la modification du type de données d'une colonne dans la table Singers
.
CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
Vous pouvez éviter que la vue ne devienne non valide en castant explicitement les colonnes vers l'objet les types de données souhaités, comme suit:
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;
Accorder et révoquer l'accès à une vue
En tant qu'utilisateur du contrôle des accès ultraprécis, vous devez disposer du droit SELECT
sur
une vue. Pour accorder le droit SELECT
à un rôle de base de données sur une vue:
GoogleSQL
GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;
PostgreSQL
GRANT SELECT ON TABLE SingerNames TO Analyst;
Pour révoquer le droit SELECT
sur une vue à partir d'un rôle de base de données:
GoogleSQL
REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;
PostgreSQL
REVOKE SELECT ON TABLE SingerNames FROM Analyst;
Interroger une vue
Les méthodes pour interroger les droits d'un demandeur ou pour l'affichage des droits d'un définition sont les mêmes. Toutefois, selon le type de sécurité de la vue, Spanner peut avoir besoin ou non de vérifier les objets de schéma référencés dans la vue par rapport le rôle de base de données du compte principal qui a appelé la requête.
Interroger la vue des droits d'un demandeur
Si une vue dispose des droits du demandeur, l'utilisateur doit disposer de droits sur tous les éléments sous-jacents objets de schéma de la vue afin de l'interroger.
Par exemple, si un rôle de base de données a accès à tous les objets référencés par
SingerNames
, il peut interroger la vue SingerNames
:
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Interroger la vue des droits d'un définition
Si une vue possède des droits de définition, l'utilisateur peut l'interroger sans avoir besoin
sur les objets sous-jacents, à condition d'accorder le rôle requis
Droit SELECT
sur la vue.
Dans l'exemple suivant, un utilisateur doté du rôle "Analyste" de base de données souhaite interroger
la vue SingerNames
. Cependant, l'accès lui est refusé pour la raison suivante : SingerNames
est une vue des droits du demandeur et le rôle Analyste n'a pas accès à toutes les
aux objets sous-jacents. Dans ce cas, si vous décidez de fournir à l'analyste
à la vue, mais ne souhaitent pas leur donner accès à Singers
.
vous pouvez remplacer le type de sécurité de la vue par
des droits de définition. Après avoir remplacé le type de sécurité de la vue, accordez
Accès du rôle Analyste à la vue. L'utilisateur peut maintenant interroger la vue SingerNames
même s'ils n'ont pas accès à la table Singers
.
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Remplacer une vue
Vous pouvez remplacer une vue en utilisant l'instruction CREATE OR REPLACE VIEW
pour modifier
la définition de la vue ou son type de sécurité.
Remplacer une vue revient à supprimer et recréer la vue. Tous les accès accordées à la vue initiale doivent être accordées à nouveau après le remplacement vue.
Pour remplacer la vue des droits d'un demandeur par celle d'un définition des droits:
CREATE OR REPLACE VIEW SingerNames SQL SECURITY DEFINER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
Supprimer une vue
Après la suppression d'une vue, les rôles de base de données disposant de droits ne le sont plus
y accéder. Pour supprimer une vue, utilisez l'instruction DROP VIEW
.
DROP VIEW SingerNames;
Obtenir des informations sur une vue
Vous pouvez obtenir des informations sur les vues d'une base de données en interrogeant les tables dans son
Schéma INFORMATION_SCHEMA
.
Le tableau
INFORMATION_SCHEMA.TABLES
fournit les noms de toutes les vues définies.INFORMATION_SCHEMA.VIEWS
fournit les noms, la définition de la vue, le type de sécurité et le texte de la requête toutes les vues définies. Utilisateurs FGAC disposant du droitSELECT
sur la vue peuvent obtenir des informations sur la vue à partir de la tableINFORMATION_SCHEMA.VIEWS
. Si ce n'est pas le cas, les autres utilisateurs FGAC doivent disposer du rôlespanner_info_reader
DroitSELECT
pour la vue.
Pour vérifier la définition de la vue et le type de sécurité d'une vue appelée
ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';