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.

graph TD subgraph Tabela_Base [Tabela Base: Funcionários] direction TB DB[(Banco de Dados)] %% Uso de aspas duplas para permitir o caractere pipe | T_Cols["ID | Nome | Salário | Departamento | Telefone"] T_Rows["Ana | 9.0000 | TI| (69) 96584-5475
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;