O que são Visões? (Views)
No nível externo da arquitetura ANSI/SPARC, o banco de dados é percebido como uma “visão externa”, definida por um esquema externo. Diversos usuários podem ter visões externas diversas. C.J. Date
Uma visão é considerada uma tabela virtual; ela não existe fisicamente, mas aparece ao usuário como uma tabela real.
João | 9.500 | TI| (69) 8694-4758
Maria |10000| RH| (69) 7845-4756
Humberto | 9000|ADM| (69) 9869-5874"] DB --- T_Cols T_Cols --- T_Rows end Tabela_Base --> Processo{Definição da VIEW} subgraph Restricoes [Mecanismos de Filtro] direction LR V_Rest["Restrição Vertical
(Colunas Selecionadas)"] H_Rest["Restrição Horizontal
(Cláusula WHERE)"] end Processo --> V_Rest Processo --> H_Rest V_Rest --> View_Final H_Rest --> View_Final subgraph View_Virtual [Objeto: VIEW] View_Final[[Virtual: vw_ti_contatos]] V_Display["Nome | Departamento
---
Ana | TI
João | TI"] end %% Estilização style Tabela_Base fill:#f9f9f9,stroke:#333,stroke-width:2px style View_Virtual fill:#e1f5fe,stroke:#01579b,stroke-width:2px style V_Rest fill:#fff9c4,stroke:#fbc02d style H_Rest fill:#fff9c4,stroke:#fbc02dgraph TD
Características
- A visão é operada como se fosse uma tabela real
- É uma janela para um subconjunto de dados de uma tabela
- Toda mudança na tabela é automaticamente e instantaneamente refletida através desta janela
- Mostra Linhas pertinentes para os usuários
- Visões podem ser usadas para aumentar a segurança escondendo detalhes das estruturas das tabelas
- Podem esconder a complexidade de uma consulta
Sintaxe SQL
CREATE VIEW nome_da_view AS subquery
Observação: Utilize a estrutura de tabelas da aula Restrições de Integridade
Implementando a VIEW apresentando somente um atributo da tabela e calculando a idade
CREATE OR REPLACE VIEW VW_ATENDENTES AS
SELECT
NOME,
EXTRACT(
YEAR
FROM
AGE (CURRENT_DATE, DATA_NASCIMENTO)
) AS IDADE
FROM
PESSOAS P
INNER JOIN ATENDENTES A ON A.ID_PESSOA = P.ID;
Implementando uma VIEW para esconder a complexidade de uma consulta que apresenta a diferença de idade entre funcionários.
CREATE OR REPLACE VIEW VW_FUNCIONARIOS_POR_IDADE AS
WITH ListaIdades AS (
SELECT
NOME,
EXTRACT(
YEAR
FROM
AGE (CURRENT_DATE, DATA_NASCIMENTO)
) AS IDADE
FROM
PESSOAS P
INNER JOIN ATENDENTES A ON A.ID_PESSOA = P.ID
)
SELECT
nome,
idade,
idade - LAG(idade) OVER (ORDER BY idade ASC) AS diferenca_anos
FROM ListaIdades
ORDER BY idade ASC;
Executando a VIEW
SELECT * FROM VW_FUNCIONARIOS;
SELECT * FROM VW_FUNCIONARIOS ORDER BY NOME ;
SELECT NOME FROM VW_FUNCIONARIOS WHERE IDADE > 40;
SELECT * FROM VW_FUNCIONARIOS_POR_IDADE;
Schemas e Views
Podemos construir um schema com todas as visões das tabelas, separando assim a estrutura das tabelas.
Observação: feito isso e aliado a uma administração de ROLEs aumenta a segurança dos dados.
Repare que o usuário do esquema consulta é diferente do usuário de produção
Criando o schema consulta
CREATE SCHEMA CONSULTA AUTHORIZATION usuario_online;
Alterando o schema da view
ALTER VIEW VW_FUNCIONARIOS SET SCHEMA consulta;
Ou prodemos implementar a view dentro do esquema consulta
CREATE VIEW CONSULTA.VW_FUNCIONARIOS AS
SELECT nome
FROM funcionarios;