Criar e gerenciar visualizações

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 chamada view_name já existir, a instrução CREATE VIEW falhará.

  • CREATE OR REPLACE VIEW define uma nova visualização no banco de dados atual. Se uma visualização chamada view_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égio SELECT na visualização podem receber informações sobre a visualização da tabela INFORMATION_SCHEMA.VIEWS. Outros usuários do FGAC vão precisar do papel spanner_info_reader se não tiverem o privilégio SELECT 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';