Crie e faça a gestão de visualizações de propriedades

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 nome view_name, a declaração CREATE VIEW falha.

  • CREATE OR REPLACE VIEW define uma nova vista na base de dados atual. Se já existir uma vista com o nome view_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égio SELECT na visualização de propriedade podem obter informações sobre a visualização de propriedade na tabela INFORMATION_SCHEMA.VIEWS. Os outros utilizadores da FGAC precisam da função spanner_info_reader se não tiverem o privilégio SELECT 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';