Esta página descreve como criar e gerir vistas do Spanner para bases de dados com o dialeto GoogleSQL e bases de dados com o dialeto PostgreSQL. Para mais informações sobre as vistas do Spanner, consulte o artigo Vista geral das vistas.
Autorizações
Para criar, conceder e revogar o acesso a uma vista, tem de ter a autorização
spanner.database.updateDdl
.
Crie uma vista
Para criar uma vista, use a declaração DDL
CREATE VIEW
para dar um nome à vista e fornecer a consulta que a define. Esta declaração tem duas formas:
CREATE VIEW
define uma nova vista na base de dados atual. Se já existir uma vista com o nomeview_name
, a declaraçãoCREATE VIEW
falha.CREATE OR REPLACE VIEW
define uma nova vista na base de dados atual. Se já existir uma vista com o nomeview_name
, a respetiva definição é substituída.
A sintaxe da declaração CREATE VIEW é a seguinte:
{CREATE | CREATE OR REPLACE } VIEW view_name SQL SECURITY { INVOKER | DEFINER } AS query
Uma vez que uma vista é uma tabela virtual, o query
que especificar tem de fornecer nomes para todas as colunas nessa tabela virtual.
Além disso, o Spanner verifica o query
que especifica através da resolução estrita de nomes, o que significa que todos os nomes de objetos de esquema usados na consulta têm de ser qualificados de forma a identificar inequivocamente um único objeto de esquema. Por exemplo, nos exemplos que se seguem, a coluna SingerId
na tabela Singers
tem de ser qualificada como Singers.SingerId
.
Tem de especificar o elemento SQL SECURITY
como INVOKER
ou DEFINER
na declaração CREATE VIEW
ou CREATE OR REPLACE VIEW
. Para mais informações sobre a diferença entre os dois tipos de segurança, consulte o artigo Vista geral.
Por exemplo, suponha que a tabela Singers
está definida conforme mostrado no seguinte:
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 );
Pode definir a vista SingerNames
com os direitos do invocador, conforme mostrado no seguinte:
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 vista SingerNames
é usada numa consulta tem duas colunas: SingerId
e Name
.
Embora esta definição da visualização SingerNames
seja válida, não cumpre a prática recomendada de converter tipos de dados para garantir a estabilidade nas alterações ao esquema, conforme descrito na secção seguinte.
Práticas recomendadas para a criação de visualizações
Para minimizar a necessidade de atualizar a definição de uma vista, converta explicitamente o tipo de dados de todas as colunas da tabela na consulta que define a vista. Quando o faz, a definição da vista pode permanecer válida nas alterações ao esquema do tipo de uma coluna.
Por exemplo, a seguinte definição da vista SingerNames
pode tornar-se 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;
Pode evitar que a vista se torne inválida convertendo explicitamente as colunas nos tipos de dados necessários, como mostrado no exemplo seguinte:
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;
Conceda e revogue o acesso a uma visualização de propriedade
Como utilizador do controlo de acesso detalhado, tem de ter o privilégio SELECT
numa visualização de propriedade. Para conceder o privilégio SELECT
numa vista a uma função da base 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
numa vista de uma função de base de dados:
GoogleSQL
REVOKE SELECT ON VIEW SingerNames FROM ROLE Analyst;
PostgreSQL
REVOKE SELECT ON TABLE SingerNames FROM Analyst;
Consultar uma vista
A forma de consultar os direitos de um invocador ou os direitos de um definidor é a mesma. No entanto, consoante o tipo de segurança da vista, o Spanner pode ou não ter de verificar os objetos de esquema referenciados na vista em relação à função de base de dados do principal que invocou a consulta.
Consulte a vista de direitos de um invocador
Se uma visualização de propriedade tiver os direitos do invocador, o utilizador tem de ter privilégios em todos os objetos de esquema subjacentes da visualização de propriedade para poder consultá-la.
Por exemplo, se uma função de base de dados tiver acesso a todos os objetos referenciados pela visualização SingerNames
, pode consultar a visualização SingerNames
:
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Consulte a vista de direitos de um definidor
Se uma vista tiver direitos do definidor, um utilizador pode consultar a vista sem precisar de privilégios nos objetos subjacentes, desde que conceda à função necessária o privilégio SELECT
na vista.
No exemplo seguinte, um utilizador com a função de base de dados de analista quer consultar a visualização SingerNames
. No entanto, o acesso do utilizador é recusado porque SingerNames
é uma vista de direitos do invocador e a função de analista não tem acesso a todos os
objetos subjacentes. Neste caso, se decidir conceder ao analista acesso à visualização, mas não quiser conceder-lhe acesso à tabela, pode substituir o tipo de segurança da visualização pelos direitos do definidor.Singers
Depois de substituir o tipo de segurança da visualização, conceda acesso à função de analista à visualização. O utilizador pode agora consultar a vista SingerNames
, mesmo que não tenha acesso à tabela Singers
.
SELECT COUNT(SingerID) as SingerCount FROM SingerNames;
Substitua uma vista
Pode substituir uma vista usando a declaração CREATE OR REPLACE VIEW
para alterar a definição da vista ou o tipo de segurança da vista.
A substituição de uma vista é semelhante à eliminação e recriação da vista. Todas as concessões de acesso dadas à vista inicial têm de ser concedidas novamente após a substituição da vista.
Para substituir a vista de direitos de um invocador pela vista 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;
Elimine uma vista
Depois de uma vista ser eliminada, as funções da base de dados com privilégios na mesma deixam de ter acesso. Para eliminar uma vista, use a declaração DROP VIEW
.
DROP VIEW SingerNames;
Receba informações sobre uma vista
Pode obter informações sobre as vistas numa base de dados consultando as tabelas no respetivo esquema INFORMATION_SCHEMA
.
A tabela
INFORMATION_SCHEMA.TABLES
apresenta os nomes de todas as visualizações definidas.A tabela
INFORMATION_SCHEMA.VIEWS
fornece os nomes, a definição da vista, o tipo de segurança e o texto da consulta de todas as vistas definidas. Os utilizadores do FGAC que tenham o privilégioSELECT
na visualização de propriedade podem obter informações sobre a visualização de propriedade na tabelaINFORMATION_SCHEMA.VIEWS
. Os outros utilizadores da FGAC precisam da funçãospanner_info_reader
se não tiverem o privilégioSELECT
para a vista.
Para verificar a definição da vista e o tipo de segurança de uma vista denominada
ProductSoldLastWeek
:
SELECT * FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = 'ProductSoldLastWeek';