Esta página descreve 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 da propriedade, você deve 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 o 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 as query
que você especifica usando uma resolução de nomes rigorosa, o que significa que todos os nomes de objeto de esquema
usados na consulta precisam ser qualificados de maneira que identifiquem um único objeto de esquema. Nos exemplos que seguem a coluna SingerId
,
na tabela Singers
, os exemplos precisam ser qualificados como Singers.SingerId
.
É necessário especificar SQL SECURITY
como INVOKER
ou DEFINER
na
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 visualizações.
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 definição a seguir da visualização SingerNames
pode se tornar inválida como resultado da alteração 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;
Para evitar que a visualização se torne inválida, faça o cast explícito das colunas para os tipos de dados desejados, da seguinte maneira:
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 acesso a uma visualização
Como usuário do controle de acesso detalhado, você precisa ter o privilégio SELECT
em
uma visualização. Para conceder o privilégio SELECT
a uma visualização para uma função 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 uma função do 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 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 de um 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 uma função de banco de dados tiver acesso a todos os objetos referenciados pela
visualização SingerNames
, ela 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 do banco de dados quer consultar a visualização SingerNames
. No entanto, o acesso do usuário é negado porque SingerNames
é uma visualização de direitos do invocador e a função de analista não tem acesso a todos os
objetos subjacentes. 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 acesso à visualização à função de analista. 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
É possível substituir uma visualização usando a instrução CREATE OR REPLACE VIEW
para mudar
a definição ou o tipo de segurança da visualização.
Substituir uma visualização é semelhante a descartá-la e recriá-la. Todas as permissões de acesso concedidas à visualização inicial precisam ser concedidas novamente após a substituição da visualização.
Para substituir a visualização de direitos de um invocador pela visualização de direitos de um 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, as funções do banco de dados com privilégios nela 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
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. Os usuários do FGAC que têm privilégioSELECT
na visualização podem receber informações sobre a visualização na 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';