Nesta página, descrevemos como criar e gerenciar visualizações do Spanner. Para mais informações sobre as visualizações do Spanner, consulte Sobre as visualizações.
Permissões
Para criar, conceder e revogar o acesso a uma vista, é necessário ter o
Permissão spanner.database.updateDdl
.
Criar uma visualização
Para criar uma visualização, use a instrução DDL
CREATE VIEW
para nomear o
exibir e fornecer a consulta que a define. Essa instrução tem dois formatos:
CREATE VIEW
define uma nova visualização no banco de dados atual. Se uma visualização chamadaview_name
já existir, a instruçãoCREATE VIEW
falhará.CREATE OR REPLACE VIEW
define uma nova visualização no banco de dados atual. Se uma visualização chamadaview_name
já existir, sua definição será substituída.
A sintaxe da instrução CREATE VIEW é:
{CREATE | CREATE OR REPLACE } VIEW view_name SQL SECURITY { INVOKER | DEFINER } AS query
Como a visualização é uma tabela virtual, a query
que você
especificar devem fornecer nomes para todas as colunas nessa tabela virtual.
Além disso, o Spanner verifica o query
especificado com a resolução de nome rígida, ou seja, todos os nomes de objeto do esquema
usadas na consulta devem ser qualificados de modo que identifiquem inequivocamente um
objeto de esquema único. Nos exemplos que seguem a coluna SingerId
,
na tabela Singers
, os exemplos precisam ser qualificados como Singers.SingerId
.
Você precisa especificar SQL SECURITY
como INVOKER
ou DEFINER
no
instrução CREATE VIEW
ou CREATE OR REPLACE VIEW
. Para mais informações sobre
a diferença entre os dois tipos de segurança, consulte Sobre as vistas.
Por exemplo, suponha que a tabela Singers
seja definida da seguinte maneira:
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 );
É possível definir a visualização SingerNames
com os direitos do invocador da seguinte maneira:
CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
A tabela virtual criada quando a visualização SingerNames
é usada em uma consulta tem duas
colunas, SingerId
e Name
.
Embora essa definição da visualização SingerNames
seja válida, ela não segue a prática recomendada de fazer o cast de tipos de dados para garantir a estabilidade entre alterações de esquema, conforme descrito na próxima seção.
Práticas recomendadas ao criar visualizações
Para minimizar a necessidade de atualizar a definição de uma visualização, transmita explicitamente o tipo de dados de todas as colunas da tabela na consulta que define a visualização. Ao fazer isso, a definição da visualização pode permanecer válida nas alterações de esquema para o tipo de uma coluna.
Por exemplo, a seguinte definição da visualização SingerNames
pode ficar
inválido devido à mudança do tipo de dados de uma coluna na tabela Singers
.
CREATE VIEW SingerNames SQL SECURITY INVOKER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
É possível evitar que a visualização se torne inválida transmitindo explicitamente as colunas para o os tipos de dados desejados, da seguinte forma:
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;
Conceder e revogar o acesso a uma visualização
Como usuário de controle de acesso detalhado, você precisa ter o privilégio SELECT
em
uma visualização. Para conceder o privilégio SELECT
em uma visualização a um papel de banco de dados:
GoogleSQL
GRANT SELECT ON VIEW SingerNames TO ROLE Analyst;
PostgreSQL
GRANT SELECT ON TABLE SingerNames TO Analyst;
Para revogar o privilégio SELECT
em uma visualização de um papel de banco de dados:
GoogleSQL
REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;
PostgreSQL
REVOKE SELECT ON TABLE SingerNames FROM Analyst;
Consultar uma visualização
A maneira de consultar os direitos de um invocador ou a visualização de direitos de um definidor é a mesma. No entanto, dependendo do tipo de segurança da visualização, o Spanner precisa verificar os objetos de esquema referenciados na visualização em relação o papel de banco de dados do principal que invocou a consulta.
Consultar a visualização de direitos do invocador
Se uma visualização tiver os direitos do invocador, o usuário precisará ter privilégios em todos os objetos de esquema da visualização para consultá-la.
Por exemplo, se um papel de banco de dados tiver acesso a todos os objetos referenciados pelo
SingerNames
, ele poderá consultar a visualização SingerNames
:
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Consultar a visualização de direitos de um definidor
Se uma visualização tiver direitos de definição, o usuário poderá consultá-la sem precisar
privilégios sobre os objetos subjacentes, desde que você conceda o papel necessário
Privilégio SELECT
na visualização.
No exemplo a seguir, um usuário com a função de analista de banco de dados quer consultar
a visualização SingerNames
. No entanto, o usuário não tem o acesso porque SingerNames
é uma visualização de direitos do invocador e o papel de analista não tem acesso a todos os
objetos. Nesse caso, se você decidir fornecer ao analista
acesso à visualização, mas não quer conceder acesso ao Singers
tabela, você pode substituir o tipo de segurança da visualização por
direitos do definidor. Depois de substituir o tipo de segurança da visualização, conceda ao
Acesso do papel de analista à visualização. Agora o usuário pode consultar a visualização SingerNames
.
mesmo que não tenham acesso à tabela Singers
.
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Substituir uma visualização
Você pode substituir uma visualização usando a instrução CREATE OR REPLACE VIEW
para mudar
a definição da visualização ou o tipo de segurança dela.
Substituir uma visualização é semelhante a descartá-la e recriá-la. Qualquer acesso concessões dadas à visualização inicial precisam ser concedidas novamente após a substituição do visualização.
Para substituir a visualização de direitos de um invocador por uma visualização de direitos do definidor:
CREATE OR REPLACE VIEW SingerNames SQL SECURITY DEFINER AS SELECT Singers.SingerId AS SingerId, Singers.FirstName || ' ' || Singers.LastName AS Name FROM Singers;
Exclua uma visualização
Depois que uma visualização é descartada, os papéis do banco de dados com privilégios não têm mais
acesso. Para excluir uma visualização, use a instrução DROP VIEW
.
DROP VIEW SingerNames;
Receber informações sobre uma visualização
Você pode obter informações sobre visualizações em um banco de dados consultando tabelas em sua
esquema INFORMATION_SCHEMA
.
A tabela
INFORMATION_SCHEMA.TABLES
fornece os nomes de todas as visualizações definidas.O
INFORMATION_SCHEMA.VIEWS
fornece os nomes, a definição de visualização, o tipo de segurança e o texto da consulta de todas as visualizações definidas. Usuários do FGAC que têm o privilégioSELECT
na visualização pode receber informações sobre a visualização da tabelaINFORMATION_SCHEMA.VIEWS
. Outros usuários do FGAC precisam do papelspanner_info_reader
se não tiverem PrivilégioSELECT
para a visualização.
Para verificar a definição de visualização e o tipo de segurança de uma visualização chamada
ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';