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 visualização, você precisa ter a permissão spanner.database.updateDdl
.
Criar uma visualização
Para criar uma visualização, use a instrução DDL CREATE VIEW
para nomear a visualização 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 uma visualização é uma tabela virtual, o query
especificado precisa fornecer nomes para todas as colunas nessa tabela virtual.
Além disso, o Spanner verifica o query
especificado usando a resolução de nome estrita, o que significa que todos os nomes de objeto de esquema usados na consulta precisam ser qualificados de modo que identifiquem inequivocamente um único objeto de esquema. Nos exemplos que seguem a coluna SingerId
,
na tabela Singers
, os exemplos precisam ser qualificados como Singers.SingerId
.
Especifique 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 );
Você pode 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 da visualização SingerNames
a seguir pode se tornar
inválida como resultado da 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;
Para evitar que a visualização se torne inválida, transmita explicitamente as 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 o acesso a uma vista
Como usuário de controle de acesso refinado, 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
de 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 pode ou não precisar verificar os objetos de esquema referenciados na visualização em relação ao 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 direitos do invocador, o usuário precisará ter privilégios em todos os objetos de esquema subjacentes da visualização para consultá-la.
Por exemplo, se um papel de banco de dados tiver acesso a todos os objetos referenciados pela visualização 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, um usuário poderá consultá-la sem precisar
de privilégios nos objetos subjacentes, desde que você conceda ao papel necessário o
privilégio SELECT
na visualização.
No exemplo a seguir, um usuário com o papel de banco de dados Analista quer consultar
a visualização SingerNames
. No entanto, o usuário tem acesso negado porque SingerNames
é a visualização de direitos de um invocador e o papel 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 quiser fornecer acesso à tabela Singers
, é possível substituir o tipo de segurança da visualização pelos
direitos do definidor. Depois de substituir o tipo de segurança da visualização, conceda
o acesso do papel de analista à visualização. Agora o usuário pode consultar a visualização SingerNames
, mesmo que não tenha 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 alterar
a definição da visualização ou o tipo de segurança dela.
A substituição de uma visualização é semelhante a descartar e recriar a visualização. Qualquer concessão de acesso à visualização inicial precisa ser concedida 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, os papéis de banco de dados com privilégios sobre ela 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
É possível receber informações sobre visualizações em um banco de dados consultando tabelas no esquema INFORMATION_SCHEMA
.
A tabela
INFORMATION_SCHEMA.TABLES
fornece os nomes de todas as visualizações definidas.A tabela
INFORMATION_SCHEMA.VIEWS
fornece os nomes, a definição da 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 o privilégioSELECT
na visualização podem receber informações sobre a visualização da tabelaINFORMATION_SCHEMA.VIEWS
. Outros usuários do FGAC vão precisar do papelspanner_info_reader
se não tiverem o privilégioSELECT
para a visualização.
Para verificar a definição da visualização e o tipo de segurança de uma visualização chamada
ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';