Views, Sequences e Synonyms: Um tutorial prático
Tags: braziliandevs, oracle, sql, tutorial
Published: 2023-12-07 21:51:24


Dentro do Oracle Database, existem diversas funcionalidades projetadas para facilitar a vida do administrador de banco de dados. Entre elas, destacam-se três recursos essenciais: Views, Sequences e Synonyms. Neste tutorial, exploraremos cada um desses elementos com o objetivo de proporcionar uma compreensão sólida de suas funcionalidades e de algumas aplicações comuns no dia a dia.

# O que são Views?

Uma **view** é essencialmente uma **tabela virtual** tratada como uma **consulta SQL armazenada**. Ao contrário de armazenar dados diretamente, ela apresenta uma representação de uma ou mais tabelas com base em uma consulta específica. No contexto do Oracle, as views podem assumir formas simples, relacionadas a uma única tabela, ou complexas, envolvendo junções de múltiplas tabelas, funções agregadas, subconsultas, entre outros elementos.

## Criando Views
A sintaxe básica para a criação de uma view é a seguinte:
```sql
CREATE VIEW nome_da_view AS
SELECT consulta_a_ser_feita;

```
- CREATE VIEW: especifica que estamos criando uma visão/visualização.
- nome_da_view: o nome da visão  a ser criada. Isso será usado em consultas futuras para se referir a essa visualização.
- AS SELECT: especifica que a view se traduz na consulta SELECT a seguir.
- consulta_a_ser_feita: Consulta SELECT a ser armazenada e usada na visão. 

#### Exemplo:
Cria uma view com os clientes ativos da tabela cliente, selecionando o id, nome e endereço deles.
```sql
CREATE VIEW v_cliente_ativo AS
SELECT cliente_id, nome, endereco
FROM clientes
WHERE status = 'ativo';

```

Depois de criar a view, você pode usá-la em consultas como se fosse uma tabela real:

```sql
SELECT * FROM nome_da_view;
```

## Alterando Views

Caso você queira alterar uma view já existente, basta "criar" a view como antes, mas adicionando o _OR REPLACE_, indicando que caso uma view com o nome indicado exista, ela será atualizada:

```sql
CREATE OR REPLACE nome_da_view AS 
SELECT alteracao_da_consulta;
```
####Exemplo:
Seguindo o exemplo dos clientes ativos, a view foi alterada para incluir apenas clientes ativos que estejam em São Paulo.
```sql
CREATE OR REPLACE VIEW v_cliente_ativo AS
SELECT cliente_id, nome, endereco
FROM clientes
WHERE status = 'ativo' AND cidade = 'São Paulo';

```
## Deletando Views
Por fim, para apagar uma view, usa-se o comando DROP:
```sql
DROP VIEW nome_da_view;
```
## Mais alguns exemplos de aplicações de VIEW


## View Agregando Dados
É possível criar uma view agregadora de dados, ou seja, pode-se calcular a média ou a soma de uma coluna dentro dela:

```sql
CREATE VIEW v_media_salario AS
SELECT departamento, AVG(salario) as media_salario
FROM funcionarios
GROUP BY departamento;

```
##View com junções

```sql
CREATE VIEW v_pedidos_detalhes AS
SELECT p.numero_pedido, p.data, c.nome as nome_cliente, pr.nome as nome_produto
FROM pedidos p
JOIN clientes c ON p.cliente_id = c.cliente_id
JOIN produtos pr ON p.produto_id = pr.produto_id;
```
A view resultante, v_pedidos_detalhes, terá as colunas mencionadas acima, combinando informações das tabelas pedidos, clientes e produtos que possuem ids equivalentes.

# O que são Sequences?


Uma sequência é **um objeto de banco de dados usado para gerar números exclusivos**. Esses valores, **comumente** empregados como **chaves primárias** em tabelas, asseguram a singularidade dos registros. Ao criar um objeto utilizando uma Sequence, é possível aplicar regras específicas às suas sequências, permitindo sua ordenação ascendente ou descendente por um número predefinido de ciclos. Diferentemente das colunas de índice, as Sequences não estão vinculadas diretamente à tabela principal; em vez disso, referenciam os dados representados.

## Criando uma Sequence
A sintaxe geral de uma sequence pode ter muitos parâmetros, mas muitos deles são opcionais:
```sql
CREATE SEQUENCE [schema.]nome_sequence
[MINVALUE minval|NOMINVALUE]
[MAXVALUE maxval|NOMAXVALUE]
[START WITH valor_inicial]
[INCREMENT BY valor_incremental]
[CYCLE|NOCYCLE]
[CACHE valor_cache|NOCACHE]
[ORDER|NOORDER];
```
- schema: O nome do schema (coleção de objetos dentro do banco de dados) onde a sequência será armazenada. Se omitido, a sequência será criada em seu próprio schema.
- nome_sequence: O nome da sequência a ser criada; é o único parâmetro obrigatório.
- MINVALUE minval: O valor mínimo gerado pela sequência (pode ter até 28 dígitos e deve ser menor ou igual ao valor_inicial e menor que o MAXVALUE). 
- NOMINVAL: Indica que não há valor mínimo especificado para a sequência, mas usa -1026 como mínimo para sequências descendentes e 1 para sequências ascendentes (valor padrão caso nada seja especificado).
- MAXVALUE maxval: Valor máximo gerado pela sequência. Deve ser um número inteiro de até 28 dígitos. 
- NOMAXVALUE: Assim como o NOMINVAL, indica que não há valor máximo especificado para a sequência, mas usa 1027 como máximo para sequências ascendentes e -1 para sequências descendentes (valor padrão caso nada seja especificado).
- START WITH startval: Primeiro número a ser gerado a partir da sequência. Para sequências ascendentes, o padrão é o valor mínimo e, para sequências descendentes, o padrão é o valor máximo. Pode ter até 28 dígitos.
- INCREMENT BY incrementval: Intervalo entre os números de sequência. Deve ser um número inteiro, pode ser positivo ou negativo (não pode ser zero). Pode ter até 28 dígitos. Se for omitido, a sequência será incrementada em 1.
- CYCLE (ciclo): Indica que a sequência continua gerando valores após atingir MAXVALUE ou MINVALUE. Se a sequência for ascendente e atingir o MAXVALUE, ela gera o MINVALUE. Se a sequência for decrescente e atingir o MINVALUE, ela gera o MAXVALUE.
- NOCYCLE: Indica que a sequência não pode gerar mais valores após o máximo ser atingido (valor padrão).
- CACHE cacheval: É quantos valores da sequência que o banco de dados aloca e mantém na memória para poder acessá-lo mais rapidamente, o que também melhora o desempenho.
- NOCACHE: Indica que nenhum valor de sequência é alocado e armazenado em cache. 
- ORDER: Indica que os números de sequência são gerados na ordem em que são solicitados.
- NOORDER: Indica que não há garantia de que os números de sequência estejam na ordem em que foram solicitados (padrão).

####Exemplo:
A seguir, cria-se uma sequence que começa em 1, incrementa em 1 e tem valor máximo de 1000, sem ciclos.
```sql
CREATE SEQUENCE seq_cliente_id
  START WITH 1
  INCREMENT BY 1
  MAXVALUE 1000
  NOCYCLE;
```

####Exemplo 2:
Sequência que decrementa em 1 e começa no 500, com ciclos e com 10 valores armazenados em cache para melhorar performance:
```sql
CREATE SEQUENCE sequendec
MINVALUE 10
MAXVALUE 500
START WITH 500
INCREMENT -1
CYCLE
CACHE 10;
```
## Alterando Sequences
Usando o exemplo anterior, mudaremos o _sequendec_ para decrementar em 10 ao invés de 1.

```sql
ALTER SEQUENCE sequendec
INCREMENT BY -10;
```

## Deletando Sequences
Para apagar uma sequence, é preciso que ela esteja em seu schema ou você tenha permissão para apagar objetos de outros schemas. O comando para deletar é o seguinte:

```sql
DROP SEQUENCE seq_nome;
```

# O que são Synonyms?

Os Synonyms (sinônimos) são **objetos do banco de dados que representam nomes alternativos** para outros objetos, como uma tabela, uma view, uma sequência ou uma stored procedure.
Principalmente, podem ser usados para impedir a visualização real dos dados, sem alterar os dados originais, independente de quem estiver acessando ou de qual banco os dados estão armazenados.


## Criando um Synonym
A sintaxe básica de um synonym é a seguinte:
```sql
CREATE [PUBLIC] SYNONYM [schema .] synonym FOR [schema .] object [@ dblink];
```
- [PUBLIC] / (PRIVATE): especifica se o synonym público, com acesso disponível a todos usuários ou privado, com acesso disponível a pessoas específicas.
- [schema .]: Selecione o esquema do banco de dados (ou nome de usuário) que possui o objeto no qual você deseja criar. Se omitido, alguns bancos de dados como oracle, criam seu próprio esquema. Com limite máximo de 32 bytes.
- FOR:  Regra a ser aplicada especificando sobre qual entidade o synonym está sendo criado. Variando entre:

###Diferença entre sinônimos públicos e privados
Para ficar um pouco mais visualizável, aqui está uma tabela demarcando as diferenças gerais de um sinônimo público e um privado:

![Diferença entre os sinônimos públicos e privados](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dznpj1pdns81rwpilnar.png)
####Exemplo 1

A seguir, um sinônimo público para o objeto cliente no esquema de vendas. Todos os usuários do banco de dados podem consultar o sinônimo client e acessar a tabela venda.clientes (se tiverem acesso à tabela venda.clientes subjacente).
```sql
CREATE PUBLIC SYNONYM client
FOR vendas.clientes;
```
####Exemplo 2
Neste exemplo, syn_clientes é o alias para a tabela clientes no esquema schema_clientes.
```sql
CREATE SYNONYM syn_clientes FOR schema_clientes.clientes;
```
####Exemplo 3
Usar sinônimos para referenciar objetos em outros bancos de dados vinculados:

```sql
CREATE DATABASE LINK link_outro_bd CONNECT TO usuario IDENTIFIED BY senha USING 'nome_bd';

CREATE SYNONYM sin_tabela_outro_bd FOR tabela@link_outro_bd;
```
##Excluindo um synonym
Para excluir o sinônimo, basta usar o comando DROP:

```sql
DROP SYNONYM nome_do_sinonimo;
```
Caso o synonym seja público, isso deve ser especificado durante o comando, diferente dos privados:

```sql
DROP PUBLIC SYNONYM nome_do_sinonimo;
```
Também é possível alterar o sinônimo criado:

```sql
ALTER SYNONYM sin_cliente
RENAME TO sin_cliente_atualizado;
```

#Considerações finais

Em resumo, as Views, Sequences e Synonyms são ferramentas valiosas para o gerenciamento de um banco de dados, ajudando e melhorando diversas funcionalidades dele. No entanto, é imperativo destacar que os recursos devem ser devidamente implementados, em casos onde o seu uso faz sentido: As views, por exemplo, têm o poder de simplificar a complexidade das consultas, mas também podem sobrecarregar o processamento. Já as Sequences, fundamentais para a garantia de unicidade e ordem de valores, podem acabar tendo problemas, como lacunas, se não administradas corretamente. O mesmo vale para os Synonyms que, oferecendo uma boa flexibilidade, podem transformar essa liberdade em ambiguidade e dificultar a manutenção. Dessa forma, é preciso conhecer e entender os recursos à disposição e avaliar cuidadosamente as demandas do projeto a ser realizado. Continue a explorar e aplicar essas ferramentas para aprimorar suas habilidades. Boa sorte em suas jornadas futuras!

![Resumo sobre Views, Sequences e Synonyms](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/klxs0ulgsw8yvu94xg74.png)