Uma view é uma tabela virtual definida por uma consulta SQL. Use views para encapsular lógicas de consulta complexas e permitir que outros usuários ou aplicações executem um simples SELECT na view, em vez de escrever a consulta subjacente manualmente.
Por exemplo, se seu data warehouse armazena registros de pedidos e a equipe de análise precisa acessar resumos de receita sem expor detalhes brutos das transações, crie uma view que pré-una e agregue as tabelas relevantes. A equipe de análise consulta a view e as tabelas subjacentes permanecem protegidas.
O Hologres permite criar views baseadas em tabelas internas, tabelas externas ou outras views, incluindo views federadas que combinam dados de tabelas internas e externas.
Observações de uso
Regras de modificação de dados
|
Tipo de view |
Permite modificar dados? |
|
View de tabela única |
Sim — alterações na view atualizam a tabela base, e mudanças na tabela base refletem-se na view. Restrinja o acesso de escrita à view para evitar modificações não intencionais. |
|
View de múltiplas tabelas |
Não — os dados em views de múltiplas tabelas são somente leitura. |
Views entre schemas e SLPM
Se o modelo de permissão no nível de schema (SLPM) estiver ativado em um banco de dados, não crie views que referenciem tabelas em diferentes schemas. Como schemas distintos exigem permissões diferentes sob o SLPM, não é possível consultar views entre schemas.
Autorização de view
O Hologres segue o modo security definer do PostgreSQL para autorização de views. Para consultar uma view, o usuário deve atender às duas condições abaixo:
|
Função |
Permissão necessária |
|
Criador da view (Usuário A) |
SELECT na tabela base |
|
Consumidor da view (Usuário B) |
SELECT na view |
O Usuário B não precisa de acesso direto à tabela base, apenas à view. O sistema usa as permissões do criador da view durante a execução.
Sintaxe
CREATE VIEW <view_name> AS
SELECT column1, column2, ...
FROM table_name
WHERE [condition];
<view_name> é o nome da view. A instrução SELECT define a consulta representada pela view.
Exemplos
Crie uma view baseada em uma tabela interna
-
Crie uma tabela interna e insira dados de exemplo:
CREATE TABLE holo_test ( amount decimal(10, 2), rate decimal(10, 2) ); INSERT INTO holo_test VALUES (12.12, 13.13), (14.14, 15.15), (16.16, 17.17), (17.1, 17), (18.01, 19); -
Crie uma view na tabela e consulte-a:
CREATE VIEW holo_view AS SELECT * FROM holo_test; SELECT * FROM holo_view;Saída esperada:
amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15 16.16 | 17.17 17.10 | 17.00 18.01 | 19.00 (5 rows)
Crie uma view baseada em uma tabela externa
-
Crie uma tabela externa mapeada para uma tabela do MaxCompute (ODPS):
CREATE FOREIGN TABLE IF NOT EXISTS holo_foreign_test ( amount decimal(10, 2), rate decimal(10, 2) ) SERVER odps_server OPTIONS (project_name '<projectname>', table_name '<odps_name>'); SELECT * FROM holo_foreign_test LIMIT 2; -
Crie uma view na tabela externa e consulte-a:
CREATE VIEW foreign_view AS SELECT * FROM holo_foreign_test; SELECT * FROM foreign_view LIMIT 2;Saída esperada:
amount | rate --------+------- 12.12 | 13.13 14.14 | 15.15
Crie uma view federada
Uma view federada unifica dados de tabelas internas e externas em um único objeto consultável. Esse recurso é útil quando parte dos dados reside no armazenamento interno do Hologres e o restante está em uma fonte externa, como o MaxCompute. É possível consultar ambas as fontes por meio de uma única view sem mover dados. A view federada usa UNION ALL para combinar as duas fontes.
CREATE VIEW view1 AS
SELECT * FROM holo_view
UNION ALL
SELECT * FROM foreign_view;
SELECT * FROM view1;
Saída esperada:
amount | rate
--------+-------
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.10 | 17.00
18.01 | 19.00
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
12.12 | 13.13
14.14 | 15.15
16.16 | 17.17
17.1 | 17
18.01 | 19
(20 rows)
Mais operações
Renomeie uma view
Renomear views requer Hologres V2.1.18 ou posterior.
ALTER VIEW <view_name_1> RENAME TO <view_name_2>;
Remova uma view
DROP VIEW <view_name>;
Liste todas as views
Execute o seguinte SQL para listar todas as views no schema atual:
SELECT n.nspname AS "Schema",
c.relname AS "Name",
CASE c.relkind
WHEN 'r' THEN 'table'
WHEN 'v' THEN 'view'
WHEN 'm' THEN 'materialized view'
WHEN 'i' THEN 'index'
WHEN 'S' THEN 'sequence'
WHEN 's' THEN 'special'
WHEN 'f' THEN 'foreign table'
WHEN 'p' THEN 'table'
WHEN 'I' THEN 'index'
END AS "Type",
pg_catalog.pg_get_userbyid(c.relowner) AS "Owner"
FROM pg_catalog.pg_class c
LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
WHERE c.relkind IN ('v', '')
AND n.nspname <> 'pg_catalog'
AND n.nspname <> 'information_schema'
AND n.nspname !~ '^pg_toast'
AND pg_catalog.pg_table_is_visible(c.oid)
ORDER BY 1, 2;
Se você usar um cliente psql, execute \dv.
Consulte o DDL de uma view
CREATE EXTENSION hg_toolkit;
SELECT hg_dump_script('<view_name>');