Você está na página 1de 122

1

APOSTILA DE
LABORATÓRIO DE
BANCO DE DADOS

Autor: Alcione Dias da Silva


2

Sumário
1 Comparativo entre Banco de Dados Relacional e Orientado a Objetos............................................5
2 Banco de dados orientado a objetos..................................................................................................5
História.............................................................................................................................................5
Adoção de Banco de Dados Orientado a Objetos............................................................................6
Recursos Técnicos...........................................................................................................................6
Vantagens e Desvantagens...............................................................................................................6
Padrões.............................................................................................................................................7
Referências e notas..........................................................................................................................8
3 Instalando o Banco de Dados............................................................................................................9
4 Oracle Arquitetura e Componentes.................................................................................................22
Estrutura de Memória....................................................................................................................25
Processos em Background.............................................................................................................26
Arquitetura - Estrutura Lógica e Física.........................................................................................26
Arquitetura Lógica:........................................................................................................................27
Principais Tablespaces...................................................................................................................33
Comandos para Manipulação de um Tablespace...........................................................................34
5 Inicializando e fechando um Database............................................................................................36
Opções de Startup..........................................................................................................................36
NOMOUNT...................................................................................................................................36
MOUNT.........................................................................................................................................37
OPEN.............................................................................................................................................37
Ativação.........................................................................................................................................38
Opções de Shutdown.....................................................................................................................39
Shutdown Abort.............................................................................................................................39
Shutdown Immediate.....................................................................................................................40
Shutdown Transactional.................................................................................................................40
Shutdown Normal..........................................................................................................................41
6 Funcionamento dos Online Redo LogFiles.....................................................................................42
Adicionando Grupos de Online RedoLog File..............................................................................42
Adicionando Membros a Grupos de Online Redo Log File..........................................................43
7 Criação de Usuários.........................................................................................................................45
Criando um usuário........................................................................................................................45
Privilégios de Sistema....................................................................................................................46
Concedendo privilégios de sistema................................................................................................46
O que é um Role............................................................................................................................47
Criando e atribuindo um role.........................................................................................................47
Alterando sua Senha......................................................................................................................48
Concedendo privilégios de objeto..................................................................................................49
A palavra-chave WITH GRANT OPTION....................................................................................52
A palavra-chave PUBLIC..............................................................................................................52
Confirmando privilégios Concedidos............................................................................................53
Revogando privilégios de objeto...................................................................................................54
Criando um Sinônimo para um objeto...........................................................................................55
Remoção de um Sinônimo.............................................................................................................56
8 O Dicionario de Dados Interno........................................................................................................59
Dicionário de dados Oracle ...........................................................................................................59

Autor: Alcione Dias da Silva


3

Objetivos:.......................................................................................................................................59
Visão Geral:...................................................................................................................................59
Usuários de Dicionário de dados...................................................................................................68
Consultando o Dicionário de dados...............................................................................................68
Classes de Visões...........................................................................................................................68
Visões adicionais............................................................................................................................69
Consultando o Dicionário de dados...............................................................................................69
Verificando constraints em uma tabela..........................................................................................71
9 Conexões de rede.............................................................................................................................74
Terminologias e Conceitos ............................................................................................................74
Terminologia e conceitos de conectividade..............................................................................74
Database Service (serviço de banco de dados): .......................................................................74
Service Name (nome do serviço)..............................................................................................74
Listener (ouvidor): ...................................................................................................................75
Modelos de configuração da rede Oracle......................................................................................75
Gerenciamento Local: ..............................................................................................................75
Gerenciamento Centralizado: ...................................................................................................75
Nomeação no Servidor (Host naming): ...................................................................................75
Nomeação Local (Local naming): ............................................................................................76
Nomeação em Diretório (Directory naming): ..........................................................................76
Oracle Names: ..........................................................................................................................76
Nomeação Externa: ..................................................................................................................76
ldap.ora: ....................................................................................................................................76
listener.ora: ...............................................................................................................................77
names.ora: ................................................................................................................................77
tnsnames.ora: ............................................................................................................................77
sqlnet.ora: .................................................................................................................................77
Configuração do lado servidor ......................................................................................................79
O processo ouvidor (listener).........................................................................................................79
Métodos de conexão......................................................................................................................79
Geração e transmissão de conexão:...............................................................................................79
Conexão direta através do despachante:...................................................................................80
Sessão de redirecionamento:..........................................................................................................81
Configurando o método de nomeação local(tnsnames.ora)...........................................................83
O arquivo tnsnames.ora.............................................................................................................83
O arquivo sqlnet.ora .................................................................................................................85
Solucionando problemas no lado cliente..................................................................................86
10 Objetos de um Banco de dados.....................................................................................................89
Criando Sequences........................................................................................................................89
Visão Geral:...............................................................................................................................89
Criando uma Sequence..............................................................................................................90
Confirmando sequences............................................................................................................91
Usando uma sequence...............................................................................................................92
Pseudocolunas NEXTVAL e CURRVAL..................................................................................92
Regras para usar NEXTVAL e CURRVAL...............................................................................92
Usando uma sequence...............................................................................................................93
Mantendo Valores de Sequence em Cache................................................................................93
Intervalos na sequence..............................................................................................................93

Autor: Alcione Dias da Silva


4

Verificando o próximo valor da sequence disponível sem incrementá-lo.................................94


Alterando uma sequence...........................................................................................................94
Removendo uma sequence........................................................................................................95
Criando Visões...............................................................................................................................97
O que é uma visão?...................................................................................................................97
Vantagens das Visões:...............................................................................................................97
Criando uma Visão....................................................................................................................98
Visões simples comparadas a visões complexas.......................................................................99
Criando e alterando uma visão...............................................................................................100
Criando uma visão Complexa.....................................................................................................101
Regras para realizar operações DML em uma visão...............................................................102
Usando a cláusula WITH CHECK OPTION..........................................................................103
Negando Operações DML......................................................................................................104
Confirmando Nomes e Estruturas de Visões...........................................................................105
Removendo uma Visão...........................................................................................................106
Criando Índices............................................................................................................................108
O que é um Índice..................................................................................................................108
Como os índices são criados...................................................................................................109
Quando é usado um índice?....................................................................................................109
Técnicas de Otimização..........................................................................................................109
Estrutura de um índice.............................................................................................................110
B*Tree.....................................................................................................................................110
Estrutura de índice...................................................................................................................110
Tipos de índice........................................................................................................................110
Criando um índice...................................................................................................................111
Mais não significa Melhor.......................................................................................................112
Regras gerais para criação de um índice.................................................................................112
Não devemos criar um índice:.................................................................................................112
Confirmando índices...............................................................................................................113
Removendo um índice.............................................................................................................114
Triggers........................................................................................................................................117
Store Procedures..........................................................................................................................118
11 Backup e Recovery......................................................................................................................119
Conceito.......................................................................................................................................119
backup físico................................................................................................................................119
backup lógico...............................................................................................................................119
Backup Off-line (Backup Frio)....................................................................................................120
Backup Online (Backup Quente).................................................................................................120
Exemplo de scritp para geração de um backup físico com database fechado.............................120
(Backup Frio – Base de dados desmontada):...............................................................................120
Passos para geração de um backup físico com database aberto (procedimento manual)............121
(Backup Quente – Base de dados montada, sistemas em Produção):..........................................121

Autor: Alcione Dias da Silva


5

1 Comparativo entre Banco de Dados


Relacional e Orientado a Objetos.
2 Banco de dados orientado a objetos
Um banco de dados orientado a objetos é um banco de dados em que cada informação é
armazenada na forma de objetos. O gerenciador do banco de dados para um orientado a objeto é
referenciado por vários como ODBMS ou OODBMS.
Existem dois fatores principais que levam a adoção da tecnologia de banco de dados orientados a
objetos. A primeira, é que em um banco de dados relacional se torna difícil de manipular com dados
complexos. Segundo, os dados são geralmente manipulados pela aplicação escrita usando
linguagens de programação orientada a objetos, como C++, C#, Java ou Delphi, e o código precisa
ser traduzido entre a representação do dado e as tuplas da tabela relacional, o que além de ser uma
operação tediosa de ser escrita, consome tempo. Esta perda entre os modelos usados para
representar a informação na aplicação e no banco de dados é também chamada de “perda por
resistência”.

História
Os sistemas de gerenciamento de banco de dados orientado a objetos cresceram fora das pesquisas
durante o começo da metade dos anos 80, buscando ter sustentação intrínseca da gerência da base
de dados para objetos gráfico-estruturados. O termo “sistema de banco de dados orientado a
objetos” surgiu originalmente por volta de 1985. Projetos de pesquisa notáveis incluem Encore-
Ob/Server (Brown University), EXODUS (University of Wisconsin), IRIS (Hewlett-Packard), ODE
(Bell Labs), ORION (Microelectronics and Computer Technology Corporation or MCC), Vodak
(GMD-IPSI), e Zeitgeist (Texas Instruments). O projeto ORION teve mais artigos publicados do
que qualquer outro. Won Kim, do MCC, compilou os melhores destes artigos num livro publicado
pelo MIT Press.[1]
Surgiram produtos comerciais, como o GemStone (Servio Logic, alterado para GemStone Systems),
Gbase (Graphael), e Vbase (Ontologic). No começo da metade dos anos 90 vimos novos produtos
comerciais entrarem no mercado. Deste inclui-se ITASCA (Itasca Systems), Matisse (Matisse
Software), Objectivity/DB (Objectivity, Inc.), ObjectStore (Progress Software, adquirido pela
eXcelon, a qual era originalmente Object Design), ONTOS (Ontos, Inc., alterado para Ontologic),
O2[2] (O2 Technology, surgiu de várias companhias, adquirido pela Informix, qual por sua vez foi
adquirida pela IBM), POET (agora da FastObjects da Versant que adquiriu a Poet Systems), e
Versant Object Database (Versant Corporation). Alguns destes produtos se mantem no mercado,
tendo alguns se unido com novos produtos.
Os Sistema de Gerenciamento de Banco de Dados Orientados a Objetos adicionaram o conceito de
Persistência da programação orientada a objetos. No ínicio os produtos comerciais eram integrados
com várias linguagens GemStone (Smalltalk), Gbase (Lisp), e Vbase (COP). O COP era o C Object
Processor, uma linguagem proprietária baseada no C ( COP é diferente de C++. Apesar de ambas
terem C como base C++ também foi influenciada Pela Simula). Durante praticamente todos os anos
90, o C++ dominou o mercado comercial de Gerenciadores de Banco de Dados Orientados a

Autor: Alcione Dias da Silva


6

Objetos. Os vendedores acrescentaram o Java no final dos anos 90 e mais recentemente o C#.

Adoção de Banco de Dados Orientado a Objetos


Banco de dados orientados a objetos baseados numa programação persistente adquiriram um nicho
nas áreas como banco de dados espaciais, telecomunicações, e áreas científicas como física de alta
energia e Biologia molecular. Eles tiveram pouco impacto nas principais aplicações comerciais de
processamento de dados, embora sejam utilizados em algumas áreas especializadas em serviços
financeiros. Há também que notar que estes bancos guardam a maior base de dados do mundo
( mais de 1000 Terabytes da Stanford Linear Accelerator Center) e tem a maior taxa de inserção
atingida por um banco de dados comercial ( mais de um Terabyte por hora).
Iniciando em 2004, os bancos de dados orientados a objetos tiveram um segundo período de
crescimento quando os projetos de banco de dados livres surgiram com diversos recursos e de fácil
uso, porque eles eram totalmente escritos em linguagens orientada a objetos, como o Java, C++ ou
C#.

Recursos Técnicos
Num banco de dados orientado a objetos puro, os dados são armazenados como objetos onde só
podem ser manipulados pelos métodos definidos pela classe de que estes objetos pertencem. Os
objetos são organizados numa hierarquia de tipos, e subtipos que recebem as características de seus
supertipos. Os objetos podem conter referências para outros objetos, e as aplicações podem
conseqüentemente acessar os dados requeridos usando um estilo de navegação de programação.
A maioria dos banco de dados também oferecem algum tipo de linguagem de consulta, permitindo
que os objetos sejam localizados por uma programação declarativa mais próxima. Isso é na área das
linguagens de consulta orientada a objetos, e a integração da consulta com a interface de navegação,
faz a grande diferença entre os produtos que são encontrados. Uma tentativa de padronização foi
feita pela ODMG (Object Data Management Group) com a OQL (Object Query Language).
O acesso aos dados pode ser rápido porque as junções são geralmente não necessárias (como numa
implementação tabular de uma base de dados relacional), isto é, porque um objeto pode ser obtido
diretamente sem busca, seguindo os ponteiros.
Outra área de variação entre os produtos é o modo que este schema do banco de dados é definido.
Uma característica geral, entretanto, é que a linguagem de programação e o schema do banco de
dados usam o mesmo modo de definição de tipos.
Aplicações multimídia são facilitadas porque os métodos de classe associados com os dados são
responsáveis pela correta reprodução.
Muitos banco de dados orientados a objetos oferecem suporte a versões. Um objeto pode ser visto
de todas as várias versões. Ainda, versões de objetos podem ser tratadas como objetos na versão
correta. Alguns banco de dados orientados a objetos ainda provem um suporte sistemático a triggers
e constraints que são as bases dos bancos ativos.

Vantagens e Desvantagens
Benchmarks entre ODBMSs e relacionais DBMSs tem mostrado que ODBMS podem ser
claramente superiores para certos tipos de tarefas. A principal razão para isto é que várias operações

Autor: Alcione Dias da Silva


7

são feitas utilizando interfaces navegacionais ao invés das relacionais, e o acesso navegacional é
geralmente implementado de forma muito eficientemente por ponteiros.[3]
Críticos das tecnologias baseadas em Bancos de Dados Navegacionais, como os ODBMS, sugerem
que as técnicas baseadas em ponteiros são otimizadas para “rotas de pesquisa” ou pontos de vista
muito específicos. Entretanto, para o propósito de consultas gerais a mesma informação, técnicas
baseadas em ponteiros tenderão a ser mais lentas e mais difíceis de se formular do que as
relacionais. Desta maneira, a abordagem navegacional parece simplificar para usos dos específicos
conhecidos às custas do uso geral, ignorando usos futuros.
Outra coisa que trabalha contra os ODBMS parece ser a perda da interoperabilidade com um grande
número de ferramentas/características que são tidas como certas no mundo SQL, incluindo a
indústria de padrões de conectividade, ferramentas de relatório, ferramentas de OLAP e backup, e
padrões de recuperação. Adicionalmente, banco de dados orientado a objetos perdem o fundamento
formal matemático, ao contrário do modelo relacional, e isto as vezes conduz a fraqueza na
sustentação da consulta. Entretanto esta objeção é descartada pelo fato que alguns ODBMSs
suportam totalmente o SQL em adição ao acesso navegacional (Objectivity/SQL++). Mas, o uso
eficaz pode requerer acordos para manter ambos os paradigmas sincronizados.
De fato há uma tensão intrínseca entre a noção de encapsulamento, que esconde os dados e somente
os disponibiliza através de uma interface de métodos publicados, e o presuposto de muitas
tecnologias de bancos de dados, de que estes dados podem ser acessados por consultas baseadas em
seu conteúdo ao invés de caminhos predefinidos. O pensamento centrado em bancos de dados tende
a ver o mundo através de forma declarativa e dirigida a uma visão de atributos, enquanto a OOP
tenta ver o mundo através um ponto de vista comportamental. Esta é uma das várias “perdas por
resistência” que envolvem OOP e banco de dados.
Embora alguns afirmem que a tecnologia de banco de dados orientado a objetos fracassou, os
argumentos essenciais em seu favor permanecem válidos, e as tentativas de integrar as
funcionalidades de bancos de dados mais próxima as linguagens de programação orientadas a
objeto continuam tanto nas comunidades de pesquisa quanto nas industriais.

Padrões
O ODMG (Object Database Management Group) era um consórcio de vendedores de banco de
dados orientados a objetos e mapeadores objeto-relacionais, membros da comunidade acadêmica, e
parceiros interessados. A meta era criar um conjunto de especificações que permitiriam a
portabilidade das aplicações que armazenam objetos em sistemas de gerenciamento de banco de
dados. Foram publicadas várias versões desta especificação. O último release foi a ODMG 3.0. Em
2001, a maioria dos principais vendedores de banco de dados orientado a objetos e mapeadores de
objeto-relacionais reivindicaram a conformidade com a ODMG Java Language Binding. A
conformidade com os demais componentes da especificação foi variada.[4] Em 2001, o ODMG
Java Language Binding foi submetido para o Java Community Process como base para a
especificação Java Data Objects. As companhias membras do ODMG decidiram então concentrar
esforços na especificação do Java Data Objects. Como resultado, a ODMG se dissolveu em 2001.
Várias idéias do banco de dados orientado a objetos foram absorvidas pela SQL:1999 e tem sido
implementadas em vários graus nos produtos de banco de dados objeto-relacional.
Em 2005 Cook, Rai e Rosenberger propuseram abandonar todos os esforços de padronização para
introduzir APIs adicionais de consulta orientadas a objetos e, ao invés disso, usar as próprias

Autor: Alcione Dias da Silva


8

linguagens orientadas a objetos, como o JAVA e o .NET. Como resultado surgiram as Consultas
Nativas (Native Queries). Similarmente, a Microsoft anunciou a LINQ (Language Integrated
Query) e DLINQ, uma implementação do LINQ, em setembro de 2005, para prover a aproximação
da capacidade da linguagem de consulta integrada do banco de dados com as linguagens de
programação C# e VB.NET 9.
Em fevereiro de 2006, o OMG (Object Management Group) anunciou que havia concedido o direito
de desenvolver novas especificações baseadas na especificação ODMG 3.0 e a formação do ODBT
WG (Object Database Technology Working Group). O ODBT WG planeja criar um conjunto de
especificações que incorporará avanços da tecnologia de banco de dados orientados a objetos (ex.
replicação), gerenciamento de dados (ex. indexação espacial) e formato de dados (ex. XML) e
incluir novas características dentro deste padrão que dará suporte ao dominios onde as bancos de
dados orientadas a objeto estão sendo adotadas (ex. sistemas de Tempo real).

Referências e notas
1. ↑ Kim, Won. Introduction to Object-Oriented Databases. The MIT Press, 1990. ISBN 0-
262-11124-1
2. ↑ Bancilhon, Francois; Delobel,Claude; and Kanellakis, Paris. Building an Object-Oriented
Database System: The Story of O2. Morgan Kaufmann Publishers, 1992. ISBN 1-55860-
169-4.
3. ↑ Animação mostrando como um banco de dados orientado a objetos funciona
4. ↑ Barry, Douglas and Duhl, Joshua. Object Storage Fact Books: Object DBMSs and Object-
Relational Mapping. Barry & Associates, Inc., 2001. A páginas exibe a conformidade da
ODMG para a os banco de dados orientados a objetos e os produtos objeto-relacionais em
2001

Autor: Alcione Dias da Silva


9

3 Instalando o Banco de Dados


PROCESSO DE INSTALAÇÃO DO ORACLE 9I NO WINDOWS

• Rode o arquivo “setup.exe”


• “próximo”

Autor: Alcione Dias da Silva


10

• “próximo”

Autor: Alcione Dias da Silva


11

• “próximo”

Autor: Alcione Dias da Silva


12

• “próximo”

Autor: Alcione Dias da Silva


13

• “próximo”

Autor: Alcione Dias da Silva


14

• “próximo”

Autor: Alcione Dias da Silva


15

• “próximo”

Autor: Alcione Dias da Silva


16

• “próximo”

Autor: Alcione Dias da Silva


17

• “instalar”

Autor: Alcione Dias da Silva


18

Autor: Alcione Dias da Silva


19

• Informar as senhas dos usuários SYS e SYSTEM.

Autor: Alcione Dias da Silva


20

Autor: Alcione Dias da Silva


21

Tecle “sair”

Autor: Alcione Dias da Silva


22

4 Oracle Arquitetura e Componentes


• Objetivos
· Mostrar as estruturas envolvidas na conexão entre um usuário e um servidor

· Mostrar a estrutura de funcionamento de um banco de dados.

Servidor Oracle
Terminais

Autor: Alcione Dias da Silva


23

Conexão com o SGBD

Processo Servidor Proc. Usuário

Processo Servidor
 Roda no servidor
 Inclui uma única PGA
 Serve a um único usuário
 Inclui o OPI (Oracle Program Interface)
 Retorna o resultado para os clientes

Processo Cliente
 Roda na máquina do cliente
 É invocado pelas aplicações dos usuários

 Inclui o UPI (Programa de Interface com o Usuário)

 Gera chamadas a um servidor Oracle

Autor: Alcione Dias da Silva


24

Instância Oracle (Instance)

O conhecimento da arquitetura Oracle é essencial para a compreensão das técnicas de


otimização de produto. Os mecanismos de execução são estruturas de memória e os processos são
executados no servidor. Um conjunto de processos do servidor do Oracle que tem sua própria área
global do sistema e um conjunto de objetos de banco de dados associados é chamado de instância
Oracle.

 Na instância são executados processos e espaços em memória, estes permitem ao Oracle


cumprir com seu papel de manter a integridade, confidencialidade e disponibilidade dos
dados armazenados.
 A instância fica alocada na memória compartilhada (shared memory) e é a combinação do
System Global Area (SGA) com os processos background Oracle.
 É o principal acesso a um BD.
 Sempre abre uma e apenas uma para cada DATABASE.

Autor: Alcione Dias da Silva


25

Estrutura de Memória
SGA – System Global Área

A SGA é um grupo de buffers de memória compartilhados que são destinados pelo Oracle
para uma instância. Basicamente é formada pelas estruturas identificadas por shared pool, database
buffer cache e redo log buffer cache. Entretanto, em algumas configurações do Oracle podem existir
outras estruturas.
• Database Buffer Cache:Armazena em memória os blocos de dados recuperados do
banco de dados e é onde os dados são trabalhados. Esta é uma área importante para o
desempenho do BD, pois o correto dimensionamento minimizará gravações e leitura
em disco.
• Shared pool:
Divide-se em dois subcaches:
1. Biblioteca: para códigos SQL e PL/SQL;
2. Dicionário de dados.
• No cache de biblioteca, se um código consta no cache, a análise sintática e o
plano de execução serão aproveitados; se o código não consta no cache, os
procedimentos serão feitos e armazenados.
• No cache de dicionário de dados estão os metadados essenciais para o
funcionamento do BD (como os objetos e privilégios de usuários), estes ficam
armazenados num conjunto de tabelas possuídas pelos esquemas SYS e
SYSTEM.
• Redo log buffer cache: Aqui ficam as informações de redo antes de serem gravadas
no arquivo físico. Estas informações servem para recuperação da instância em caso
de falha. Além disso, um usuário só recebe retorno de sucesso em uma operação após
o redo ter sido gravado em disco.

PGA – Program Global Área

Program Área Global (PGA): Alocada quando o processo de servidor é iniciado.

Autor: Alcione Dias da Silva


26

Processos em Background

 DBWR – Databaase Writer – processo responsável por gravar as mudanças feitas no


Database Buffer Cache para o BD
 LGWR – Log Writer – processo responsável por registrar os logs do redo log buffer para os
arquivos de log
 SMON – System Monitor – checa a consistência quando o BD é aberto e inicializa a
recuperação se for o caso
 CKPT – Checkpoint Process – responsável por atualizar o status de
BD (sincronizar arquivos e buffers)
 PMON – Process Monitor – É um monitor de processos. O PMON recupera os recursos do
banco de dados que não são mais necessários para um usuário. Realiza ROLLBACK das
transações não comitadas, limpa conexões terminadas anormalmente, liberando os recursos
da SGA alocados por processos que falharam.
 ARCH – Archived – Caso o BD esteja no modo de arquivamento automático (parâmetro
ARCHIVED_LOG=TRUE) quando um arquivo de log enche, ele transfere o seu conteúdo
para uma área (ARCHIVED LOGS), configurada através do parâmetro ARCHIVED_LOG_DEST.

Arquitetura - Estrutura Lógica e Física

Autor: Alcione Dias da Silva


27

Arquitetura Lógica:
Database

“DATABASE é uma coleção de dados em disco em um ou mais arquivos em servidor de banco de


dados que coleta e mantém informações relacionadas”. Para um banco de dados (database) ser usado ele
precisa ser montado, ou seja, associado a uma instância. Antes disso, os dados estão inacessíveis a qualquer
usuário ou aplicação.
Separar a instância do banco é apenas uma forma didática de explicar, pois, na prática, esta
separação não ocorre. No entanto, pode acontecer de haver múltiplas instâncias rodando na mesma
máquina, cada uma associada ao seu banco de dados físico.

Schema

Representa a coleção de vários objetos de um usuário de banco de dados como, por


exemplo, tabelas, índices, seqüências, sinônimos etc. São associados a um banco de dados na razão
de vários esquemas para um BD.

Bloco de Dados (Data Block). O bloco de dados corresponde a um número especifico de bytes do
banco de dados para armazenado em disco. Sendo que esse valor é especificado durante a criação
do banco de dados, pelo parâmetro db_block_size. Então, o Oracle gerencia todo o espaço de
armazenamento nos arquivos de dados (datafiles) através dessas pequenas unidades chamado blocos
de dados, que carregam informações importantes como cabeçalho, diretório da tabela, diretório de
linha, dados de tabelas ou índices e espaço livre para inserções ou atualizações de dados.

Extensões(Extent)
As extensões são unidades lógicas de armazenamento composta por um conjunto de blocos
de dados, um ou mais extensões formam um segmento. As extensões são muito utilizadas para
definir a característica de armazenamento de algum objeto, como um tabela ou índice. Eles podem
influenciar muito na fragmentação de espaço ou ajudar a definir um bom plano de crescimento da
base de dados.

Segmentos (Segment)
Os segmentos são um conjunto de extensões que possui todos os dados necessários para uma
estrutura de armazenamento lógico, como as tablespaces.
Para cada tabela criada, o Oracle aloca um ou mais extensões para formar um segmento de
dados, assim, também podemos dizer que o Oracle aloca um ou mais extensões para formar um
segmento de índice.

Na arquitetura do Oracle, podemos encontrar quatro tipos de segmentos:

Autor: Alcione Dias da Silva


28

Espaços de tabela (Tablespace)

Os espaços de tabelas, ou mais conhecidas como Tablespaces, é dividido através de


unidades lógicas de armazenamento chamadas segmentos. Uma tablespace pode conter um ou mais
segmentos, segmentos do tipo de dados, índices, desfazer(rollback) ou temporário.
A tablespace é a camada lógica do Oracle, ficando anexada a uma camada física, que são os
arquivos de dados (datafiles), onde se origina o armazenamento físico dos dados.
Podemos perceber que existe uma relação entre os quatro componentes citados, analise o
raciocínio: Sem o bloco de dados não temos extensões, sem extensões não temos segmentos, e sem
segmentos não temos tablespaces e sem tablespaces não temos banco de dados Oracle.
Todos eles são responsáveis pela arquitetura lógica do banco de dados. Por isso que é
fundamental o DBA ter esses conhecimentos. Abaixo podemos ver uma demonstração gráfica de
como funciona o armazenamento lógico:

Na figura acima, observamos que nosso bloco de dados em destaque é de 8KB, então
concluímos que no momento da criação do banco de dados, o parâmetro db_block_size é de 8192

Autor: Alcione Dias da Silva


29

bytes (8Kb), esse parâmetro é estático não podendo ser alterado.


Percebemos também que a Extensão possui 24 blocos de dados, fazendo uma matemática
simples, 24 (blocos de dados) x 8192 (bytes) temos o tamanho da extensão, que possui 196608
bytes (192Kb). Seguindo o mesmo exemplo, nosso segmento possui duas extensões, determinando
que o tamanho do segmento seja de 384 Kb.
Assim podemos imaginar que se o segmento acima fosse um Segmento de Dados (Tabela), a
nossa tabela teria um tamanho de 284Kb. Isso sem levar em consideração a configuração de storage
desse segmento, que envolve os parâmetros de INITIAL, NEXT, MINEXTENTS, MAXEXTENTS
e PCTINCREASE, que já é outro assunto mais detalhado e que não nos aprofundaremos.
O tamanho da tablespace não tem vinculo nenhum com os componentes citados, pois seu
tamanho é especificado no momento de sua criação. Foi um breve resumo sobre sua arquitetura,
espero que tenham gostado do assunto e que acrescente mais informações para os futuros Dbas.

Autor: Alcione Dias da Silva


30

Oracle Arquitetura e Componentes

o Arquivo de Parâmetros: Control file = Arquivo de Controle, tradução em português para a


palavra que é muito utilizado na literatura Oracle brasileira.

• Visão Geral: O arquivo de controle é um arquivo binário necessário para iniciar e


operar com sucesso o banco de dados. O arquivo de controle é atualizado
constantemente pelo Oracle durante sua utilização, ficando disponível para escrita
apenas quando o banco de dados está aberto, ou seja, OPEN. Caso o arquivo de
controle não esteja acessível por alguma razão, o banco de dados não irá funcionar
corretamente, podendo trazer problemas ao iniciar a instância. Todo arquivo de
controle é sempre associado somente a um único banco de dados, não podendo
existir um arquivo de controle que seja utilizado por mais de uma instância. Até em
ambientes de Real Application Cluster (RAC) existe um arquivo de controle para
cada instância.

• Contéudo: Um arquivo de controle possui diversas informações de um banco de


dados que é requerida pela instância. Durante o processo de startup ou uma operação
normal, somente o Oracle Server pode modificar as informações no arquivo de
controle, deste modo, nenhum DBA ou usuário pode modificar seu contéudo.

As informações que o arquivo de controle possui são:

• Nome do banco de dados


• Data de criação do banco de dados

Autor: Alcione Dias da Silva


31

• Os nomes e localizações de cada datafile e redo log associados ao banco de


dados
• Informações sobre as tablespaces
• Possíveis datafiles com status offline
• O histórico de logs
• Sobre os archives gerados
• Backupsets e backup pieces, gerados pelo RMAN
• Backups de datafiles e informações de redo log
• Cópia de datafiles
• O valor atual do número da sequência do log
• Informações de checkpoint

Para cada datafile ou redo log que é adicionado, renomeado, modificado ou excluído
do banco de dados, o arquivo de controle é atualizado pelo Oracle Server para
garantir a modificação da estrutura física da base. Essas modificações podem ser:
• O Oracle pode identificar os datafiles e redo logs que foram abertos durante o
processo de startup.
• Identificar os arquivos que são necessários ou disponíveis em caso de
recuperação do banco de dados.

Portanto, para cada modificação na estrutura física do banco de dados, podendo ser
feita através do comando ALTER DATABASE, é altamente recomendado que seja
feito um backup do seu arquivo de controle para evitar possíveis problemas no
próximo processo de startup do banco de dados.

Como o arquivo de controle armazena informações sobre os checkpoints a cada três


segundos, o processo de plano de fundo (CKPT) registra as posições do redo log,
essas posições serão utilizadas posteriormente durante um processo de recuperação
do banco de dados, no qual o Oracle irá dizer se todas as entradas dos grupos de redo
log serão necessárias para realizar tal recuperação.

o Arquivo de Senhas: contem as senhas do DBA do sistema( é um arquivo criptografado )


pwdorcl.ora

o Datafiles: arquivo onde são gravados os dados do usuário. As informações do usuário ficam
em uma estrutura lógica chamada tablespace que corresponde a um arquivo físico chamado
datafile, quando instalamos um servidor oracle ele já cria automaticamente algumas
tablespaces cada uma com seu datafile.

o Redo Log Files: A estrutura crucial para a recuperação de banco de dados é o conjunto de
redo log files. Este conjunto de arquivos é conhecido coletivamente como redo log do banco
de dados. O redo log é construído por um conjunto de entradas que são chamadas de redo
records.
A função primária do redo log é armazenar toda e qualquer mudança realizada nos dados do

Autor: Alcione Dias da Silva


32

banco de dados. Se houver alguma falha seja no servidor Oracle ou se algum dado for
alterado permanentemente no banco de dados às informações podem ser recuperadas
utilizando o redo log files.
O banco de dados grava os arquivos redo log files de forma circular. Isto significa que
quando o arquivo do redo log files atual fica cheio o banco de dados passa para o próximo
arquivo red file. Os redo log files que não estão sendo usados são chamados de inativos.
Quando o último arquivo do redo log file for preenchido o banco de dados volta para o
primeiro, apagando informações já existentes e continuando o ciclo.

Autor: Alcione Dias da Silva


33

Principais Tablespaces
Tablespace DataFiles Função
System SYSTEM01.DBF Armazenar o Dicionário de
Dados
Rollback UNDOTBS01.DBF Armazenar os dados para
Rollback
Temporary TEMP01.DBF Área para sort (ordenação)
User USERS01.DBF Área para tabela dos usuários
Indx INDX01.DBF Armazenar os índices das
tabelas

Os arquivos normalmente ficam num diretorio ( c:\ oracle)


o Log1 e log2 ( Redo Logs): Contém as últimas operações feitas pelos usuários;
(c:\orant\database\log1orcl.ora.) ou (c:\orant\database\log2orcl.ora.)
o Control File: Arquivo de controle de um Banco de Dados oracle. Backup imprescindível.
(c:\orant\database\ctl1orcl.ora) ou (c:\orant\database\ctl2orcl.ora)
o Logs Arquivados: Local onde são armazenados os arquivos de redo log.
(c:\orant\database\archive.orcl 0001.ora) ou (c:\orant\database\archive.orcl 0002.ora)

Principais Pastas e Seus Conteúdos

ORACLE_HOME – c:\oracle
C:\orawin9
o BIN – executáveis
o Database – Banco de Dados
o Network – configuração da rede
o Listener.ora
o SQLNET.ORA
o TNSNAMES.ora

Autor: Alcione Dias da Silva


34

Comandos para Manipulação de um Tablespace

Criação de um Tablespace

sintaxe: Create Tablespace <nome da tablespace> datafile 'caminho' size TAMANHO;


exemplo: create tablespace “teste” datafile 'C:\oracle\oradata\alcione\teste.ora' size 1m;

Alteração o tamanho de um Tablespace

sintaxe: Alter database datafile 'caminho' resize TAMANHO;


exemplo: ALTER DATABASE DATAFILE 'C:\TESTE2' RESIZE 2M;

Remoção de um Tablespace

sintaxe: drop tablespace “nome da tablespace”;


exemplo: drop tablespace "teste2";

Autor: Alcione Dias da Silva


35

EXERCÍCIOS DE ARQUITETURA DO BANCO DE DADOS

1) O Que compõe a estrutura lógica de um BD?


2) O Que compõe a estrutura física de um BD?
3) O que é um tablespace?
4) O que é um datafile?
5) Defina o que é um SCHEMA de banco de dados.
6) Qual a relação entre um tablespace e um datafile?
7) Quais são os principais processos da instância ORACLE, explique cada um
deles.
8) Defina segmento de ROLLBACK.
9) Para que servem os arquivos de REDO LOG?
10) Crie um tablespace chamado CONTABILIDADE com tamanho de 1M e que
seja localizado no diretório: C:\ORACLE\ORADATA\SCAMILO\
CONTABILIDADE.DBF.
11) Altere o tamanho da tablespace CONTABILIDADE para 2M.
12) Crie uma entidade chamada FUNCIONARIO, com os seguintes campos: nome
varchar(20), codigo number, data_nascimento date. A entidade deverá fazer parte da
TABLESPACE CONTABILIDADE.
13) Remova o tablespace CONTABILIDADE da instância ativa.
14) Explique como a tablespace é organizada, através de seus segmentos e extends.

Autor: Alcione Dias da Silva


36

5 Inicializando e fechando um Database


Estágios de inicialização do Oracle (NOMOUNT | MOUNT | OPEN)

Falaremos agora dos estágios envolvidos na abertura de um banco de dados Oracle. São eles
NOMOUNT, MOUNT e OPEN. O que realmente cada um destes estágios realiza?

Apenas para relembrar, uma instância Oracle consiste na estrutura de memória SGA (System Global
Area) e nos processos de segundo plano como SMON, PMON, DBWn, LGWR, CKPT, entre outros
usados para gerenciar o banco dados. A instância só pode abrir e usar um banco de dados por vez.
Em resumo, um servidor Oracle consiste em uma instância Oracle (estruturas de memória e
processos) e um banco de dados Oracle (arquivos físicos).

Opções de Startup

NOMOUNT

Este estágio inicializa a instância sem montar o banco de dados. Isso significa que todas as
estruturas de memória e os processos de segundo plano estão posicionados, mas ainda sem ter um
banco de dados associado a essa instância. É através deste estágio que é possível criar um banco de
dados Oracle. Portanto, uma instância só deverá ser iniciada no estágio NOMOUNT durante a
criação do banco de dados ou na recriação de arquivos de controle (control files). Em resumo, a
inicialização de uma instância Oracle inclui as seguintes tarefas:
• Leitura do arquivo de inicialização SPFILE_.ora ou SPFILE.ora ou init.ora exatamente
nesta ordem porque, por padrão a partir do Oracle 9i, primeiro ele tenta abrir o spfile.ora, se
o arquivo não for encontrado ele tentará abrir o spfile.ora, se o mesmo não for encontrado
ele tentará ler o arquivo init.ora. Se o Oracle não encontrar nenhum arquivo de inicialização
ou se o DBA não fornecer um valor explícito para PFILE, a inicialização falhará. A
especificação do parâmetro PFILE com STARTUP sobrepõe o comportamento default.
• Alocação da SGA
• Inicialização dos processos de segundo plano
• Abertura do arquivo de alerta (ALERT_.ora) e dos arquivos de rastreamento
Observe que nem os arquivos de controle nem os arquivos de dados e redo log on-line estão abertos
neste estágio.

Autor: Alcione Dias da Silva


37

MOUNT

Após a instância já ter sido inicializada pelo estágio anterior, então é realizada a leitura do arquivo
de controle de modo a “associar” o banco de dados à instância já inicializada anteriormente. A
opção “startup mount” é muito útil em situações onde é necessário executar algumas operações
específicas de manutenção como renomeação de arquivos de dados, ativação e desativação de
opções de arquivamento de redo log (ARCHIVELOG) e operações de recuperação do banco de
dados. É importante salientar que se a instância já estiver inicializada “startup nomount”, mas o
banco não estiver montado, então será necessário utilizar o comando “alter database mount”.
Resumindo, montar o banco de dados inclui as tarefas a seguir:
• Associação do banco de dados a uma instância iniciada anteriormente
• Localização e abertura dos arquivos de controle (control files) especificados no arquivo de
inicialização
• Leitura dos arquivos de controle para obtenção dos nomes e status dos arquivos de dados
(data files) e arquivos de redo log on-line (log files)

É importante salientar que neste estágio não é verificada a existência dos arquivos de dados e
arquivos de redo log on-line, mas se os arquivos de controle não forem localizados conforme a
localização especificada no parâmetro CONTROL_FILES no arquivo de inicialização, então um
erro será retornado, o banco de dados não será montado e a instância permanecerá no estado
NOMOUNT. Se o DBA utilizar a opção “startup mount” para inicializar o Oracle e quiser abrir o
banco de dados, então será necessário utilizar o comando “alter database open”.

OPEN

Neste terceiro e último estágio, o banco de dados é disponibilizado para acesso dos usuários. A
operação normal de um banco de dados significa que uma instância é iniciada e o banco de dados é
montado e aberto. Portanto, qualquer usuário válido pode conectar ao banco de dados e executar
operações comuns de acesso a dados. Durante esse estágio final, o servidor Oracle verifica se é
possível abrir todos os arquivos de dados e arquivos de redo log on-line, além de verificar a
consistência do banco de dados onde neste caso, o processo de segundo plano SMON (System
Monitor) iniciará a recuperação da instância se necessário. Resumindo, a abertura do banco de
dados inclui as seguintes tarefas:
• Abertura dos arquivos de dados (data files)
• Abertura dos arquivos de redo log on-line (log files)
• Chama o processo SMON se necessário para a recuperação da instância em caso de uma

Autor: Alcione Dias da Silva


38

falha de instância ocorrida enquanto o banco de dados estava aberto e em operação


anteriormente.

É importante salientar que se algum arquivo de dados ou arquivo de redo log on-line não estiver
presente, então o banco de dados não abrirá permanecendo no estado MOUNT e o servidor Oracle
retornará um erro.

Ativação

SQL> startup
Instância ORACLE iniciada.
Total System Global Area 188743680 bytes
Fixed Size 1286460 bytes
Variable Size 88084164 bytes
Database Buffers 96468992 bytes
Redo Buffers 2904064 bytes
Banco de dados montado.
Banco de dados aberto.
Desativação

SQL> shutdown
Banco de dados fechado.
Banco de dados desmontado.I
nstância ORACLE desativada.

Autor: Alcione Dias da Silva


39

Opções de Shutdown

Opções de shutdown do Oracle Database

Ao realizar um shutdown no banco de dados você deverá ter total conhecimento sobre opções
existentes para evitar problemas desnecessários.

O Oracle Database nos oferece quatro opções de shutdown.

Shutdown Abort

Evite ao máximo utilizar essa opção, pois, esse é o caso mais radical de derrubar o banco.

- Não realiza Checkpoint;

- Não fecha os arquivos;

- Não aguarda até o final das transações atuais;

- Não aguarda até o final das sessões atuais;

- Não permite novas conexões;

Autor: Alcione Dias da Silva


40

Shutdown Immediate

Ideal quando você precisa derrubar o banco e não pode esperar que as transações cheguem ao seu
fim.

Essa é a opção mais utilizada pelos DBA´s.

- Realiza Checkpoint;

- Fecha os arquivos;

- Não aguarda até o final das transações atuais;

- Não aguarda até o final das sessões atuais;

- Não permite novas conexões;

Shutdown Transactional

Ao utilizar essa opção o banco só irá ser fechado quando terminar a última transação que estiver em
processamento.

- Realiza Checkpoint;

- Fecha os arquivos;

Autor: Alcione Dias da Silva


41

- Aguarda até o final das transações atuais;

- Não aguarda até o final das sessões atuais;

- Não permite novas conexões;

Shutdown Normal

Se você utilizar essa opção o banco só será fechado quando todos os usuários que estiverem
conectados fecharem suas conexões. Isso acaba sendo inviável caso você precise realizar uma
manutenção urgente.

- Realiza Checkpoint;

- Fecha os arquivos;

- Aguarda até o final das transações atuais;

- Aguarda até o final das sessões atuais;

- Não permite novas conexões;

Conclusão

Para realizar um Shutdown do Banco de Dados você precisa ter privilégio de DBA, conectar-se no
aplicativo SQLPlus e executar o comando:

SQL> shutdown ;

Autor: Alcione Dias da Silva


42

6 Funcionamento dos Online Redo LogFiles


Os arquivos de Online Redo log possuem as seguintes características:
• Registram todas as alterações realizadas nos dados

• Fornecem um mecanismo para Recovery

• Podem ser organizados em grupos

• Pelo menos dois grupos são necessários

• São utilizados de forma cíclica

• Quando um online redo log file é preenchido, o processo LGWR utilizará o próximo grupo.

• É chamado log switch.

• A operação de Checkpoint ocorre.

• Informações são gravadas no control file.

Adicionando Grupos de Online RedoLog File

Exemplo de comando para criação de Grupos de Redolog:

ALTER DATABASE ADD LOGFILE GROUP 2


('$HOME/ORADATA/u01/log3.rdo') SIZE 1M;

Onde: $HOME é uma variável de ambiente do ORACLE.

Autor: Alcione Dias da Silva


43

Adicionando Membros a Grupos de Online Redo Log File

Os membros dos arquivos de redo são utilizados para espelhamento dos arquivos de
Redolog, propiciando assim maior segurança dos dados.
Para proteger os arquivos contra falha no disco, o Oracle suporta arquivos de Redo log
Multiplexado. Você pode manter uma cópia do arquivo em diferentes discos e o que é recomendado.
As cópias do arquivo de redo log mantidos em discos diferentes são chamados de arquivos de log
espelhados. Cada membro de cada grupo de arquivo de log tem um arquivo de log espelhado de um
mesmo tamanho.

Exemplo de comando para criação dos redolog members:

ALTER DATABASE ADD LOGFILE MEMBER


'$home\oradata\alcione\REDO01A.LOG' TO GROUP 1;

Onde: $HOME é uma variável de ambiente do ORACLE.

Autor: Alcione Dias da Silva


44

EXERCÍCIOS DE INICIALIZAÇÃO E FECHAMENTO DO BD.

1. Qual comando utilizado para inicializar o Banco de Dados?


2. Quais são as opções de inicialização de um BD?
3. Qual o estado do BD quando ele está no modo OPEN?
4. Qual o estado do BD quando ele está no modo MOUNT?
5. Quais são as opções de SHUTDOWN em uma instância de BD?
6. Qual é a opção de SHUTDOWN mais utilizada e por quê?
7. Qual o risco em se realizar um SHUTDOWN com a opção ABORT?
8. Efetue no banco de dados todas as opções de inicialização e fechamento
contidas neste capítulo, descrevendo o que ocorreu.
9. Adicione a sua base de dados 3 grupos de redologfile.(pesquise)
10.Crie para cada grupo de redologfile um novo membro do grupo, espelhando os
membros criados em uma área de disco distinta do membro anterior.(pesquise)

Autor: Alcione Dias da Silva


45

7 Criação de Usuários
Criando um usuário
O DBA cria um novo usuário ORACLE Server ao alocar diversos privilégios de
sistema para aquele usuário. Esses privilégios, por sua vez, determinam o que o
usuário pode fazer no nível do banco de dados. O DBA cria o usuário ao executar o
comando CREATE USER. Neste momento o usuário não tem qualquer privilégio de
sistema.
Sintaxe:
CREATE USER user IDENTIFIED BY password;
Onde:
User é o nome do usuário a ser criado
Password especifica que o usuário deve fazer o login com sua senha.

Autor: Alcione Dias da Silva


46

Privilégios de Sistema
Depois de criar um usuário, o DBA pode conceder privilégios a ele.

Privilégios típicos de usuários


Privilégio de Sistema Operações autorizadas

CREATE SESSION Conexão com o banco de dados

CREATE TABLE Criação de tabelas no schema do usuário

CREATE SEQUENCE Criação de uma sequence no schema do usuário

CREATE VIEW Criação de uma visão no schema do usuário

CREATE PROCEDURE Criação de uma procedure armazenada, procedure,


function ou package no schema do usuário

Concedendo privilégios de sistema

O DBA usa o comando GRANT para alocar privilégios de sistema ao usuário. Uma
vez que o usuário receba os privilégios, poderá usá-los imediatamente.
Sintaxe:
GRANT privilege [, privilege] TO user [, user…];
Onde:
Privilege é o privilégio de sistema a ser concedido.
User é o nome do usuário.

Autor: Alcione Dias da Silva


47

O que é um Role

Um role é um grupo nomeado de privilégios relacionados que pode ser concedido ao


usuário. Este método facilita a realização e a manutenção de concessão e revogação
de privilégios.

Um usuário pode ter acesso a vários roles e vários usuários podem ser designados ao
mesmo role. Geralmente os roles são criados para uma aplicação de banco de dados.

Criando e atribuindo um role

Primeiro o DBA deve criar o role. Então, ele pode designar privilégios e usuários a
ele.

Sintaxe:

CREATE ROLE role;

Onde:
Role é o nome do role a ser criado.

Agora que o role esta criado, o DBA pode usar o comando GRANT para atribuir
usuários e privilégios a ele.
Exemplo:
Permissão para que os gerentes criem tabelas e visões. Conceder esses privilégios a
Velazques e a Rafhael.
SQL> CREATE ROLE manager;
SQL> GRANT create table, create view TO manager;
SQL> GRANT manager TO Velazques, Rafhael;

Autor: Alcione Dias da Silva


48

Alterando sua Senha

Quando o usuário é criado, ele recebe uma senha que é inicializada pelo DBA. Você
pode alterar sua senha usando o comando ALTER USER.

Sintaxe:

ALTER USER user IDENTIFIED BY password;

Onde:
User é o nome do usuário.
Password especifica a nova senha.

Nota: Embora este comando possa ser usado para alterar sua senha, há muitas outras
opções. Você deve ter o privilégio ALTER USER para alterar qualquer outra opção.

Autor: Alcione Dias da Silva


49

Concedendo privilégios de objeto

O DBA pode permitir que usuários realizem uma determinada ação em uma tabela,
visão, sequence ou procedure armazenada específica ao conceder a eles privilégios de
objeto. Os privilégios de objeto variam de objeto para objeto. A tabela abaixo
descreve os privilégios. Um proprietário de objeto tem todos os privilégios no objeto.
Para que outros usuários tenham acesso aos seus objetos de banco de dados, execute
o comando GRANT.

Privilégio de Tabela Visão Sequence Procedure Snapshot

Objeto

ALTER X X

DELETE X X

EXECUTE X

INDEX X

INSERT X X

REFERENCES X

SELECT X X X X

UPDATE X X

Autor: Alcione Dias da Silva


50

Sintaxe:
GRANT {object_priv (,object_priv ...) | ALL} [(columns)] ON object
TO {user [,user ...] | role | PUBLIC}
[WITH GRANT OPTION];

onde:
Object_priv é um privilégio de objeto a ser concedido.
ALL todos os privilégios de objeto.

Columns especifica a coluna de uma tabela ou visão na qual privilégios são


concedidos.

ON object é o objeto para o qual os privilégios são concedidos.


TO identifica a quem o privilégio é concedido.
PUBLIC concede privilégios de objeto a todos os usuários.
WITH GRANT OPTION permite que o cessionário ceda privilégios de objeto a
outros usuários e roles.

Nota: Uma procedure se refere a procedures e functions individuais e a construções


de packages públicos. Os privilégios INDEX e REFERENCES não podem ser
concedidos a um role.

Concedendo privilégios de objeto

Regras Gerais:
• Para conceder privilégios para um objeto, este deve estar em seu próprio schema
ou você deve ter privilégios de objeto WITH GRANT OPTION.
• Um proprietário de objeto pode conceder privilégio de objeto para outro usuário
ou role de um banco de dados.
• O proprietário de um objeto adquire automaticamente todos os privilégios de
objeto sobre aquele objeto.

Autor: Alcione Dias da Silva


51

Exemplo:

Concessão aos usuários Raquel e Paulo do privilégio de consultar sua tabela


empregado.

SQL> GRANT select ON empregado TO Raquel, Paulo;

Concessão de privilégios UPDATE em colunas específicas na tabela departamento a


Scott e ao role de gerente.

SQL> GRANT update(nome, regiao_id) ON departamento TO Scott, manager;

Autor: Alcione Dias da Silva


52

A palavra-chave WITH GRANT OPTION

Um privilégio que é concedido WITH GRANT OPTION pode ser passado para
outros usuários e roles pelo cessionário. Privilégios de objeto concedidos WITH
GRANT OPTION são revogados quando é revogado o privilégio do cessionário.

Exemplo:

Como usuário Alice, permitir que o usuário Scott acesse sua tabela empregado com
os privilégios para consultar a tabela e adicionar linhas à ela. Permissão para que
Scott conceda a outros esses privilégios.

SQL> GRANT select, insert ON departamento TO scott WITH GRANT OPTION;

A palavra-chave PUBLIC

Um proprietário de uma tabela pode conceder acesso a todos os usuários usando a


palavra chave PUBLIC.

Exemplo:

Como usuário Scott, permitir que todos os usuários do sistema consultem dados da
tabela departamento de Alice.

SQL> GRANT select ON alice.departamento TO PUBLIC;

Autor: Alcione Dias da Silva


53

Confirmando privilégios Concedidos


Se você tentar realizar uma operação não autorizada, por exemplo, deletar uma linha
de uma tabela para a qual não tem privilégio DELETE, o ORACLE Server não
permitirá que a operação ocorra.

Se você receber a mensagem de erro “table or view does not exist”, do ORACLE
Server, é porque executou uma das seguintes situações:
• Nomeou uma tabela ou visão que não existe.
• Tentou fazer uma operação em uma tabela ou visão para a qual não tem o
privilégio apropriado.

Quais são os seus privilégios?


Você pode acessar o dicionário de dados para verificar os seus privilégios.
Tabela do dicionário de dados Descrição

ROLE_SYS_PRIVS Privilégios de sistema concedidos a roles.

ROLE_TAB_PRIVS Privilégios de tabela concedidos a roles.

USER_ROLE_PRIVS Roles acessíveis pelo usuário

USER_TAB_PRIVS_MADE Privilégios de objeto concedidos aos objetos do usuário.

USER_TAB_PRIVS_RECD Privilégios de objeto concedidos ao usuário.

USER_COL_PRIVS_MADE Privilégios de objeto concedidos às colunas dos objetos


do usuário.

USER_COL_PRIVS_RECD Privilégios de objeto concedidos ao usuário em colunas


específicas.

Autor: Alcione Dias da Silva


54

Revogando privilégios de objeto


Remova privilégios concedidos a outros usuários usando o comando REVOKE.
Quando você usa o comando REVOKE, os privilégios especificados são revogados
para os usuários nomeados e para qualquer outro usuário que possa ter esses
privilégios.
Sintaxe:
REVOKE {privilege [,privilege ...] | ALL}
ON object
FROM {user [,user ...] | role | PUBLIC};

Exemplo:
SQL> REVOKE select, insert ON departamento FROM Scott;

Autor: Alcione Dias da Silva


55

Criando um Sinônimo para um objeto

Para se referir à tabela pertencente a outro usuário, você precisa colocar um prefixo
no nome da tabela do usuário que a criou, seguida por um ponto final. Criar um
sinônimo elimina a necessidade de qualificar o nome do objeto com o schema e
fornece a você o nome alternativo para a tabela, visão, sequence, procedure ou outros
objetos. Este método pode ser especialmente útil em nomes longos de objetos, como
visões.

Sintaxe:

CREATE [PUBLIC] SYNONYM synonym FOR object;

Onde:

PUCLIC cria um sinônimo acessível a todos os usuários.


Synonym é o nome do sinônimo a ser criado.
Object identifica o objeto para o qual é criado o sinônimo.

Regras Gerais:
• O objeto não pode estar contido em uma package.
•Um nome de sinônimo privado deve ser distinto de todos os outros objetos
possuídos pelo mesmo usuário.

Exemplo:
Como usuário Scott, criar um sinônimo privado chamado dept para a tabela
departamento de Alice.
SQL> CREATE SYNONYM dept FOR Alice.departamento;

Autor: Alcione Dias da Silva


56

Criando um Sinônimo para um objeto

Exemplo:
Criação de um sinônimo para DEPARTAMENTO_TOTAL_VU para referência mais
rápida.
SQL> CREATE SYNONYM d_total FOR departamento_total_vu;

O DBA pode criar um sinônimo público acessível a todos os usuários

SQL> CREATE PUBLIC SYNONYM dept FOR Alice.departamento;

Remoção de um Sinônimo

Para eliminar um sinônimo, use o comando DROP SYNONYM. Apenas o DBA pode
eliminar um sinônimo público.

Exemplo:
SQL> DROP SYNONYM dept;

Autor: Alcione Dias da Silva


57

Faça o DER do caso abaixo:

EXERCÏCIO: MINI-MUNDO CONDOMÍNIO

Construir um diagrama ER para uma distribuidora de condomínios.

Após a modelagem especificar os atributos das entidades, identificando chaves


primárias e estrangeiras.

Regras de Negócio:
• Um condomínio é formado por diversas unidades habitacionais.
• Cada unidade habitacional pertence a um proprietário o qual pode ser
proprietário de várias unidades.
• Uma unidade pode estar alugada para um locatário.
• Um locatário pode alugar várias unidades.
• Cada unidade pode ou não estar alugada.
• Entre os locatários e proprietários um é síndico, sendo que uma pessoa não
pode ser síndica de mais de um condomínio.
• O condomínio é formado por: cod_condominio, cod_empresa_adm,
cgc_empresa_adm, nome_empresa_adm, conta_corrente_condominio.
• Os dados da Pessoa são: cod_pessoa, nome, sexo, endereço, telefone, cpf, rg,
data_nascimento, estado_civil, tipo_pessoa_ou_sindico.
• Os dados do locatário são: cod_pessoa, cod_avalista, nome_avalista,
conjuge_avalista, data_nasc_avalista, idade_avalista, valor_bens_avalista,
pessoa_contato_locatário.
• Os dados do Proprietário são: cod_pessoa, cod_banco, agência_bancária,
conta_bancária, herdeiro_principal_proprietário.
• Os dados das Unidades são: cod_unidade, tamanho, Nro_vagas_garagem, valor_aluguel,
bloco, quadra.

1. Crie um usuário chamado ALUNO e conceda a ele os privilégios de


CONNECT e RESOURCE.
2. Crie uma TABLESPACE chamada CONDOMINIO e construa o SCHEMA de
banco de dados do CONDOMINIO sobre a estrutura criada, utilize o usuário
ALUNO criado anteriormente.
3. Utilize o dicionário de dados do ORACLE para criar um script que gere os
comandos necessários para desabilitar todas as constraints do esquema do
usuário ALUNO.

Autor: Alcione Dias da Silva


58

EXERCÍCIOS DE MANIPULAÇÃO DE USUÁRIOS

NOTA: Para este exercício ser executado é preciso criar os objetos do modelo do
condomínio.

1. Crie um ROLE chamado TabsCondo e atribua a ele os privilégios de objeto:


select, insert, update e delete, para todas as tabelas do modelo condomínio.
4. Atribua o ROLE criado para o usuário ALUNO.
5. Altere a senha do usuário ALUNO.
6. Crie uma tabela no schema aluno chamada TESTE com os campos: campo1 do
tipo number e campo2 do tipo date, em seguida insira dois registros nesta tabela.
7. Conceda para a tabela TESTE os privilégios de objeto: select e insert utilizando
as palavras-chave WITH GRANT OPTION.
8. Qual o comando que retira as concessões dadas a determinado usuário ou role?
Escreva sua sintaxe.
9. Crie um SINÔNIMO PÚBLICO para a tabela pessoa_sindico do modelo
condomínio, dê a este sinônimo o nome PESSOA.

Autor: Alcione Dias da Silva


59

8 O Dicionario de Dados Interno.


Dicionário de dados Oracle

Objetivos:

O dicionário de dados é um dos componentes mais importante do ORACLE Server.


Ele consiste em um conjunto de tabelas e visões(views) que fornecem uma referência
somente de leitura ao banco de dados.

• Descrever as visões (views) do dicionário de dados que um usuário pode


acessar.
• Consultar dados a partir do dicionário de dados.

Visão Geral:

O dicionário de dados ORACLE é criado quando o banco de dados é criado. Sempre


que o banco de dados está em operação, o dicionário de dados é atualizado e mantido
pelo ORACLE Server. Todas as tabelas do dicionário de dados pertencem ao usuário
SYS. As tabelas base são raramente acessadas diretamente, pois as informações nela
contidas são de difícil compreensão. Portanto, os usuários geralmente acessam as
visões do dicionário de dados onde as informações são apresentadas em um formato
mais facilmente acessível.

Tabelas dentro do banco de dados ORACLE

Tabelas Descrição
Tabelas de usuário Coleção de tabelas criadas e mantidas pelo usuário, como
EMP, contendo informações do usuário.
Tabelas de dados Coleção de tabela criadas e mantidas pelo Oracle, como
USER_OBJECTS, que contém informações sobre o
banco de dados.

Autor: Alcione Dias da Silva


60

Relação das principais tabelas do Dicionário de dados

DICTIONARY Informa todos os objetos que o usuário tem acesso.


DICT_COLUMNS Informa as colunas dos objetos que o usuário tem acesso.
CONSTRAINT_DEF Informa todas as definições de constraint das tabelas do usuário.
CONSTRAINT_COLUMNS Informa todas as colunas das constraints das tabelas do usuário.

VISÃO DESCRIÇÃO
2PC_NEIGHBORS(DBA_) Informa sobre conexões E/S para transações distribuídas
pendentes.
2PC_PENDING(DBA_) Informa sobre transações distribuídas pendentes.
AUDIT_EXISTS(DBA_) Entradas de trilha de auditoria pôr conta do Comando
AUDIT EXISTS
AUDIT_OBJECT(DBA_,USER_) Entradas de trilhas de auditoria para objetos do banco de
dados
AUDIT_SESSION(DBA_,USER_) Entradas de trilhas de auditoria concernentes a sessões
do banco de dados
AUDIT_STATEMENT(DBA_,USER_) Entradas de trilhas de auditoria para instruções auditadas
AUDIT_TRAIL(DBA_,USER_) Conjunto de todas as entradas de trilha de auditoria
BLOCKERS(DBA_) Sessões cujos bloqueios estão impedindo outras
transações de executar o trabalho. Veja visão relacionada
DBA_WAITERS
CATALOG(ALL_,DBA_,USER_,(CAT)) Informações sobre tabelas do banco de dados, visões,
sinônimos e seqüências
CLU_COLUMNS(DBA_,USER_) Relação de colunas de tabela para agrupar chaves
CLUSTER(DBA_,USER_ (CLU)) Informações sobre clusters indexados e de prova do banco
de dados
COL_COMMENTS(ALL_,DBA_,USER_) Comentários para colunas de tabelas e visões
COL_PRIVS(ALL_,DBA_,USER_) Informações sobre concessões em colunas específicas
COL_PRIVS_MADE (ALL_,USER_) Informações sobre concessões em colunas específicas
COL_PRIVS_RECD (ALL_,USER_) Informações sobre concessões recebidas em colunas
específicas
CONS_COLUMNS (ALL_,DBA_,USER_) Informações sobre colunas envolvidas em restrições de
integridade
CONSTRAINTS (ALL_,DBA_,USER_) Informações sobre restrições de integridade no banco de
dados

Autor: Alcione Dias da Silva


61

DATA_FILES (DBA_) Informações sobre os arquivos de dados do banco de


dados
DB_LINKS (ALL_,DBA_,USER_) Informações sobre associações de bancos de dados no
banco de dados
DDL_LOCKS (DBA_) Informações sobre bloqueios usados pôr conta de
operações DDL
DEF_AUDIT_OPTS (ALL_) Informações sobre opções default de auditoria de objetos
DEPENDENCIES (ALL_,DBA_,USER_) Informações sobre dependências de objetos no banco de
dados
DML_LOCKS (DBA_) Informações sobre bloqueios de DML no servidor
ERROS (ALL_,DBA_,USER_) Informações sobre erros de compilação detectados em
procedimentos, funções, especificações e corpos de
pacotes no banco de dados
EXP_FILES (DBA_) Descrição dos arquivos exportados
EXP_OBJECTS (DBA_) Informações sobre objetos que tenham sido exportados
incrementalmente com utilitário Export
EXP_VERSION (DBA_) Numero da versão da ultima sessão do utilitário Export
EXTENTS (DBA_,USER_) Informações sobre extensões para objetos no banco de
dados
FREE_SPACE (DBA_,USER_) Informações sobre extensões disponíveis nas tablespaces
de um banco de dados
IND_COLUMNS (ALL_, DBA_, USER_) Informações sobre as colunas que correspondem a índices
do banco de dados
INDEXES (ALL_, DBA_, USER_) Informações sobre índices no banco de dados
LABELS (ALL_) Informações sobre rótulos do sistema; útil somente com
Trusted Oracle7
LOCKS (DBA_) Informações sobre todos os bloqueios DDL e DML no
servidor do banco de dados
MOUNTED_DBS (ALL_) Informações sobre todos os bancos de dados montados;
útil somente com Trusted Oracle7
OBJ_AUDIT_OPTS (DBA_, USER_) Informações sobre opções de auditoria definidas para os
objetos do banco de dados
OBJECT (ALL_, DBA_, USER_ (OBJ)) Informações sobre objetos de banco de dados no banco
de dados
OBJECT_SIZE (DBA_, USER_) Informações de tamanho para todos os procedimentos,
funções, especificações e corpos de pacotes no banco de
dados
PRIV_AUDIT_OPTS (DBA_) Informações sobre auditoria para privilégios

Autor: Alcione Dias da Silva


62

PROFILES ( DBA_ ) Informações sobre perfis de limites de recursos em um


banco de dados
RESOURCE_LIMITS ( USER_ ) Informações sobre limites de recursos para sessão atual
de banco de dados
ROLES_PRIVS ( DBA_, USER_ ) Informações sobre personagens concedidos a um usuário
ROLES ( DBA_ ) Informações sobre personagens no banco de dados
ROLLBACK_SEGS ( DBA_ ) Informações sobre segmentos reconstrutivos no banco de
dados
SEGMENTS ( DBA_, USER_ ) Informações sobre segmentos no banco de dados
SEQUENCES ( ALL_, DBA_, USER_ (SEQ)) Informações sobre seqüências no banco de dados
SNAPSHOT_LOGS ( DBA_ , USER_ ) Informações sobre registros de instantâneos no banco de
dados
SNAPSHOTS ( ALL_, DBA_, USER_ ) Informações sobre instantâneos no banco de dados
SOURCE ( ALL_, DBA_, USER_ ) Código – fonte de procedimentos, funções, especificações
e corpos de pacotes no banco de dados
STMT_AUDIT_OPTS ( DBA_ ) Informações sobre opções de auditoria definidas para
instruções
SYNONYMS ( ALL_, DBA_, USER_ (SYN)) Informações sobre sinônimos no banco de dados
SYS_PRIVS ( DBA_, USER_) Privilégios do sistema concedidos a um usuário
TAB_COLUMNS (ALL_, DBA_, USER_ Informações sobre as colunas de tabelas e visões no
(COLS) banco de dados
TAB_COMMENTS ( ALL_, DBA_, USER_ ) Comentários para tabelas e visões no banco de dados
TAB_PRIVS ( ALL_, DBA_, USER_ ) Informações sobre concessões de privilégios de objetos
TAB_PRIVS_MADE ( ALL_, USER_ ) Informações sobre os privilégios de objetos concedidos
TAB_PRIVS_RECD ( ALL_ , USER_ ) Informações sobre privilégios de objetos recebidos
TABLES ( ALL_ , DBA_ , USER_ (TABS)) Informações sobre tabelas no banco de dados
TABLESPACES ( DBA_ , USER_ ) Informações sobre tablespace no banco de dados
TRIGGER_COLS ( ALL_ , DBA_ , USER_ ) Informações sobre as colunas que os gatilhos do banco de
dados utilizam
TRIGGERS ( ALL_ , DBA_ , USER_ ) Informações sobre gatilhos no banco de dados
TS_QUOTAS ( DBA_ , USER_ ) Informações sobre cotas de tablespace do usuário
USERS ( ALL_, DBA_, USER_ ) Informações sobre usuários no banco de dados
VIEWS ( ALL_ , DBA_ , USER_ ) Informações sobre visões no banco de dados
WAITERS ( DBA_ ) Informações sobre sessões aguardando em função de um
bloqueio mantido pôr outra sessão

Autor: Alcione Dias da Silva


63

AUDIT_ACTIONS Mapeamento de números de ações de trilha de auditoria


para descrição
CHAINED_ROWS Informações de saída sobre linhas encadeadas a partir do
comando ANALYSE. Criado pelo roteiro administrativo
UTLCHAIN.SQL
COLUMN_PRIVILEGES Informações sobre concessões de colunas
DBMS_ALERT_INFO Informações sobre alertas registrados, criados pelo pacote
de utilitários DBMS_ALERT
DBMS_LOCK_ALLOCATED Informações sobre bloqueios definidos pelo usuários,
criados pelo pacote de utilitários DBMS_LOCK
DEPTREE Informações sobre dependências de objeto. Criado pelo
roteiro administrativo UTLDTREE.SQL
DICT_COLUMNS Informações sobre colunas do dicionário de dados
DICTIONARY (DICT) Informações sobre tabelas e visões do dicionário de dados
EXCEPTIONS Informações de saída para exceções de restrições de
integridade. Criado pelo roteiro administrativo
UTLXPT.SQL
GLOBAL_NAME Informações sobre o nome global do banco de dados
IDEPTREE Informações sobre dependências de objeto. Criado pelo
roteiro administrativo UTLDTREE.SQL
INDEX_STATS Informações de estatísticas sobre índices gerados a partir
do comando ANALYZE INDEX ... VALIDATE INDEX
LOADER_COL_INFO Informações para o SQL*Loader relativas a colunas
LOADER_CONSTRAINT_INFO Informações para o SQL*Loader relativas as restrições de
integridade
LOADER_INDCOL_INFO Informações para o SQL*Loader relativas a colunas de
índice
LOADER_IND_INFO Informações para o SQL*Loader relativas a índices
LOADER_PARAM_INFO Informações para o SQL*Loader relativas a parâmetros
LOADER_TAB_INFO Informações para o SQL*Loader relativas a tabelas
LOADER_TRIGGER_INFO Informações para o SQL*Loader relativas a gatilhos
NLS_DATABASE_PARAMETERS Informações sobre definições do NLS do banco de dados;
útil somente se o servidor usar Nacional Language
Support ( NLS – Suporte à Língua Nacional )
NLS_INSTANCE_PARAMETERS Informações sobre definições do NLS do banco de dados;
útil somente se o servidor usar National Language Support
(NLS)
NLS_SESSION_PARAMETERS Informações sobre definições de NLS da sessão ; ; útil

Autor: Alcione Dias da Silva


64

somente se o servidor usar National Language Support


(NLS)
PLAN_TABLE Informações de saída sobre planos de execução do
otimizador a partir do comando EXPLAIN PLAN. Criado
pelo roteiro administrativo UTLXPLAN.SQL
PUBLIC_DEPENDENCY Informações sobre dependências de objeto
RESOURCE_COST Informações sobre custos de recursos do sistema
ROLE_ROLE_PRIVS Informações sobre personagens concedidos a outros
personagens
ROLE_SYS_PRIVS Informações sobre privilégios do sistema concedidos a
personagens
ROLE_TAB_PRIVS Informações sobre privilégios de objeto concedidos a
personagens
SESSION_PRIVS Informações sobre privilégios disponíveis para uma sessão
SESSION_ROLES Informações sobre personagens disponíveis para uma
sessão
STMT_AUDIT_OPTION_MAP Mapeamento de números de ações de trilha de auditoria
para descrições
SYSTEM_PRIVILEGE_MAP Mapeamento de número de privilégios do sistema para
descrições
TABLE_PRIVILEGES Informações sobre concessões de privilégios de objetos
TABLE_PRIVILEGE_MAP Mapeamento de números de privilégios de objetos para
descrições
V$ACCESS Informações sobre objetos atualmente em uso
V$ARCHIVE Informações sobre o log de transações arquivado do
banco de dados
V$BACKUP Informações sobre status de cópia de todos os
tablespaces ativos no banco de dados
V$BGPROCESS Informações sobre todos os processos de segundo plano
do servidor de banco de dados
V$CIRCUIT Informações sobre todos os circuitos ( conexões do
usuário ) em uma configuração de servidor multilinear
V$DATABASE Informações sobre um banco de dados a partir do arquivo
de controle do banco de dados
V$DATAFILE Informações sobre os arquivos de dados do banco de
dados
V$DBFILE Informações sobre os arquivos de dados do banco de
dados

Autor: Alcione Dias da Silva


65

V$DB_OBJECT_CACHE Informações sobre objetos no cache de objetos do servidor


de banco de dados, incluindo tabelas, visões, índices e
procedimentos
V$DISPATCHER Informações sobre processos de segundo plano do
despachador do servidor atualmente em andamento em
um servidor de banco de dados multilinear
V$ENABLEDPRIVS Informações sobre privilégios permitidos
V$FILESTAT Informações estatísticas de E/S sobre arquivos do banco
de dados
V$FIXED_TABLE Informações sobre todas as tabelas fixas no banco de
dados
V$INSTANCE Informações sobre o estado atual do servidor de banco de
dados ( INSTÂNCIA )
V$LATCH Informações sobre os bloqueios internos
( serializadores ) no servidor de banco de dados
V$LATCHHOLDER Informações sobre sessões que mantêm atualmente
bloqueios internos ( serializadores )
V$LIBRARYCACHE Informações estatísticas sobre o gerenciamento de caches
de bibliotecas
V$LICENSE Informações sobre limites de licença de software da Oracle
V$LOADCTSTAT Informações sobre estatísticas do SQL*Loader compiladas
durante uma carga do caminho direto
V$LOCK Informações sobre bloqueios de DML no servidor de banco
de dados
V$LOG Informações sobre o log de transações de um banco de
dados
V$LOGFILE Informações sobre arquivos de log de transações de um
banco de dados
V$LOGHIST Informações sobre histórico de seqüência de log de
transações de um banco de dados
V$LOG_HISTORY Informações Sobre o log de transações de um banco de
dados
V$MTS Informações de ajuste para configuração de servidor
multilinear
V$NLS_PARAMETERS Informações sobre valores atuais de parâmetros do
Suporte de Língua Nacional
V$OPEN_CURSOR Informações sobre cursores abertos de cada sessão do
banco de dados
V$PARAMETER Informações sobre cada parâmetro de inicialização do

Autor: Alcione Dias da Silva


66

servidor de banco de dados


V$PROCESS Informações sobre processos atualmente ativos
V$QUEUE Informações sobre filas do servidor multilinear
V$RECORVER_LOG Informações sobre os grupos de log de transações
arquivados, necessários para fazer a recuperação do
banco de dados
V$REQDIST Informações estatísticas sobre tempos de solicitação
V$RESOURCE Informações sobre recursos do sistema
V$ROLLNAME Informações sobre todos os segmentos reconstrutivos
ativos
V$ROLLSTAT Informações estatísticas sobre todos os segmentos
reconstrutivos ativos
V$ROWCACHE Informações estatísticas sobre atividade do dicionário de
dados
V$SECONDARY Informações sobre banco de dados secundários
montados; útil somente com Trusted Oracle7
V$SESSION Informações sobre sessões do banco de dados
V$SESSION_EVENTS Informações estatísticas de espera para cada sessão e
evento
V$SESSION_WAIT Informações sobre recursos que as sessões estejam
esperando
V$SESSTAT Informações estatísticas sobre sessões do banco de
dados
V$SESS_IO Informações sobre o uso de E/S de cada sessão
V$SGA Informações sobre a área de memória SGA do servidor de
banco de dados
V$SGASTAT Informações estatísticas sobre a área de memória SGA do
servidor de banco de dados
V$SHARED_SERVER Informações sobre os servidores de primeiro plano
compartilhados de um servidor de banco de dados
multilinear
V$SQLAREA Informações sobre cursores compartilhados
V$SQLTEXT Informações sobre instruções correspondentes a cursores
compartilhados
V$STATNAME Descrições para códigos de estatísticas de sessão
mostrados em V$SESSTAT
V$SYSSTAT Informações sobre rótulos do sistema; útil somente com o
Trusted Oracle7

Autor: Alcione Dias da Silva


67

V$SYSTEM_EVENTS Informações do sistema sobre todas as estatísticas de


eventos por sessão
V$THREAD Informações sobre linhas do log de transações do banco
de dados
V$TIMER A hora atual do sistema em centésimos de segundo
VTRANSACTION Informações sobre as transações atuais do banco de
dados
V$TYPE_SIZE Informações sobre componentes de dados de baixo nível
para ajudar na projeção de estimativas de uso de espaço
V$VERSION Informações sobre versões de bibliotecas centrais de
software do servidor Oracle7
V$WAITSTAT Informações estatísticas sobre contenção de bloqueio de
dados entre transações

Autor: Alcione Dias da Silva


68

Usuários de Dicionário de dados

O dicionário de dados é uma referência para todos os usuários do banco de dados. Ele
é uma valiosa fonte de informações para usuários finais, projetistas de aplicações e
DBA´s. O dicionário de dados também é essencial para a operação do ORACLE
Server, pois o banco de dados faz uso dele para registrar e verificar informações
sobre si próprio.

Consultando o Dicionário de dados

Você pode consultar o dicionário de dados usando um comando SQL SELECT.


Dependendo de seus privilégios, você pode consultar diversas visões.

Classes de Visões

Nomes de visões do dicionário de dados refletem sua utilização. Há quatro categorias


de visões, cada categoria tem um prefixo distinto.

Prefixo Descrição
USER_ Contém objetos pertencentes ao usuário. Por exemplo, visões com este
prefixo permitem que sejam exibidas informações sobre telas criadas
pelo usuário e privilégios concedidos por ele.
ALL_ Acessa objetos aos quais o usuário tem direitos de acesso, além de
objetos a ele pertencentes.
DBA_ Permite que usuários com privilégio DBA acessem qualquer objeto no
banco de dados.
V$ Exibe o desempenho e bloqueio do servidor do banco de dados.
Disponível inicialmente apenas ao DBA.

Autor: Alcione Dias da Silva


69

Visões adicionais

Diversas visões do dicionário de dados não usam os prefixos listados acima. Esses
incluem sinônimos para visões com nomes extensos.

Nome da Visão Descrição


DICTIONARY Lista todas as tabelas, visões e sinônimos do dicionário de
dados.
TABLE_PRIVILEGES Cessões a objetos dos quais o usuário é o cedente ou o
receptor da cessão ou ainda o proprietário.
IND É um sinônimo de USER_INDEXES

Consultando o Dicionário de dados

Exemplo:

A visão DICTIONARY lista todas as visões do dicionário de dados acessíveis ao


usuário, com uma breve descrição do objeto em uma coluna de comentário. Você
também pode fazer referência ao sinônimo da visão, DICT.

SQL > SELECT * from DICTIONARY;

Exemplo:

Você pode exibir a estrutura de qualquer visão do dicionário de dados usando o


comando SQL*Plus DESCRIBE. Exiba a estrutura de USER_OBJECTS.

SQL > describe USER_OBJECTS

Nome Nulo? Tipo


----------------------------------------- -------- --------------------
OBJECT_NAME VARCHAR2(128)
SUBOBJECT_NAME VARCHAR2(30)
OBJECT_ID NUMBER
DATA_OBJECT_ID NUMBER
OBJECT_TYPE VARCHAR2(18)
CREATED DATE

Autor: Alcione Dias da Silva


70

LAST_DDL_TIME DATE
TIMESTAMP VARCHAR2(19)
STATUS VARCHAR2(7)
TEMPORARY VARCHAR2(1)
GENERATED VARCHAR2(1)
SECONDARY VARCHAR2(1)

Exemplo:

Para visualizar uma descrição de cada coluna nas tabelas e visões do dicionário de
dados, consulte a visão DICT_COLUMNS.

SQL > SELECT column_name, comments


FROM dict_columns
WHERE table_name = ‘USER_OBJECTS’;

Exemplo:

Exiba os tipos de objetos pertencentes ao usuário.

SQL > SELECT DISTINCT object_type


FROM USER_OBJECTS;

Exemplo:

Você pode pesquisar o dicionário de dados por um tópico específico ao consultar a


coluna COMMENTS na visão DICTIONARY. Encontre todas as visões do dicionário
de dados pertinentes à palavra-chave Grant.

COLUMN table_name FORMAT A20


COLUMN comments FORMAT A30

SQL > SELECT table_name, comments


FROM DICTIONARY
WHERE LOWER(comments) like ‘%grant%’;
TABLE_NAME COMMENTS
-------------------- ------------------------------
ALL_COL_PRIVS Grants on columns for which th
e user is the grantor, grantee

Autor: Alcione Dias da Silva


71

, owner,
or an enabled role or PUBLIC
is the grantee

ALL_COL_PRIVS_MADE Grants on columns for which th


e user is owner or grantor

ALL_COL_PRIVS_RECD Grants on columns for which th


e user, PUBLIC or enabled role

Verificando constraints em uma tabela

Após criar uma tabela, você pode confirmar sua existência gerando um comando
DESCRIBE. A única constraint que você pode verificar é a NOT NULL. Para
visualizar todas as constraints em sua tabela, você pode verificar a tabela
USER_CONSTRAINTS.

Exemplo:

Confirmação das constraints na tabela EMP.

column constraint_name format a20


column constraint_type format a20
column Search_condition format a15
column r_constraint_name format a15

SQL > SELECT constraint_name, constraint_type,


Search_condition, r_constraint_name
FROM user_constraints
WHERE table_name = ‘EMP’;

CONSTRAINT_NAME CONSTRAINT_TYPE SEARCH_CONDITIO R_CONSTRAINT_NA


-------------------- -------------------- --------------- ---------------
PK_EMP P (pk)
FK_DEPTNO R (reference) PK_DEPT

Autor: Alcione Dias da Silva


72

Verificando constraints em uma tabela

Visualize os nomes da colunas em constraints ao consultar a visão do dicionário de


dados USER_CONS_COLUMNS. Essa visão é especialmente útil para constraints
que usam o nome atribuído pelo sistema.

Exemplo:

Exibição das informações de constraint de coluna no dicionário de dados para a


tabela
EMP.

column constraint_name format a20


column column_name format a20

SQL > SELECT constraint_name, column_name


FROM user_cons_columns
WHERE table_name = ‘EMP’;

CONSTRAINT_NAME COLUMN_NAME
-------------------- --------------------
FK_DEPTNO DEPTNO
PK_EMP EMPNO

Autor: Alcione Dias da Silva


73

EXERCÍCIOS - Dicionário de dados Oracle

1) Selecione todas as visões do dicionário de dados pertinentes à tabela. Você pode


ajustar os formatos de coluna usando o comando COLUMN do SQL*Plus.

2) Consulte o dicionário de dados USER_OBJECTS para ver informações sobre as


tabelas que criou.

4) Crie um script para executar uma consulta genérica que confirme as constraints
incluídas nas tabelas que você criou.

Autor: Alcione Dias da Silva


74

9 Conexões de rede
Terminologias e Conceitos

Veremos neste capítulo os conceitos e terminologias sobre conectividade e também uma introdução
aos arquivos de configuração da conexão com o banco de dados. Veremos os arquivos necessários
no lado cliente e também no lado servidor. Em um ambiente de testes, é possível fazer toda esta
configuração em uma máquina “stand alone”, possibilitando a você testar seus conhecimentos em
seu equipamento de estudo.

Terminologia e conceitos de conectividade

Vejamos agora alguns conceitos importantíssimos quando estamos falando em conectividade em


um ambiente com o BD Oracle. É importante salientar que estas terminologias e conceitos são
aplicados para qualquer plataforma operacional, desde que devidamente suportadas pelo BD Oracle:

Database Service (serviço de banco de dados):

Para o cliente, um BD Oracle aparece como um serviço, ou seja, o BD executa o trabalho como
representante do cliente. É possível existir um ou mais serviços associados a um BD, que pode
ainda ser apresentado como múltiplos serviços e ainda um serviço pode ser implementado como
várias instâncias do BD;

Service Name (nome do serviço)

É uma representação lógica do BD, é a maneira pela qual o BD se apresenta ao cliente. O service
name é um string que representa o nome global do BD, ou seja, um nome composto do nome do BD
e o nome do domínio. Esta definição é feita durante a instalação ou criação do BD.É necessário
incluir o service name na seção de dados de conexão no descritor de conexão, que veremos a seguir;

Autor: Alcione Dias da Silva


75

Listener (ouvidor):
A seção de endereço do descritor de conexão é o protocolo de endereço do listener. Para conectar a
um serviço, primeiramente o cliente entra em contato com um processo ouvidor que se encontra no
servidor de BD. O ouvidor recebe um pedido de conexão do cliente e manipula esta requisição para
o servidor de BD. Uma vez estabelecida a conexão, o cliente e o servidor de BD passam a se
comunicar diretamente;

Modelos de configuração da rede Oracle

As informações de configuração podem ser armazenadas em um arquivo de configuração local ou


em um repositório centralizado.

Gerenciamento Local:
Neste caso, todas as informações sobre a conexão estão armazenadas em um arquivo chamado
tnsnames.ora em cada um dos computadores da rede (clientes);

Gerenciamento Centralizado:
Para este modelo de configuração, as informações sobre a conexão estão armazenados em um
serviço de diretório centralizado, incluindo um servidor de diretórios LDAP ou um servidor de
nomes Oracle.

Visão geral de métodos de nomeação

Métodos de nomeação são utilizados pela aplicação cliente para analisar um identificador de
conexão para um descritor de conexão em uma tentativa de conexão com um serviço de BD.

Uma rede Oracle suporta cinco métodos de nomeação:

Nomeação no Servidor (Host naming):


Habilita o usuário em um ambiente TCP/IP para analisar nomeações através dos nomes de serviço
existentes;

Autor: Alcione Dias da Silva


76

Nomeação Local (Local naming):


Localiza endereços de rede através da utilização de informações de configuração armazenadas em
cada cliente no arquivo tnsnames.ora;

Nomeação em Diretório (Directory naming):


Analisa um serviço de BD ou nome de um serviço de rede para um descritor de conexão,
armazenado em um servidor de diretório centralizado;

Oracle Names:
É um serviço de diretórios Oracle “maquiado” de um sistema de servidor de nomes Oracle que
provê soluções de nomes para endereços para cada serviço na rede;

Nomeação Externa:
Utiliza-se de nomes de serviços de terceiros devidamente suportados.

Uma pequena empresa com apenas alguns BDs pode utilizar o método de nomeação no servidor
para armazenar nomes em um serviço de solução de nomes existente ou o método de nomeação
local armazenando nomes no arquivo tnsnames.ora em cada estação de trabalho.

Já uma grande corporação com vários BDs pode usar um método de nomeação em diretório
armazenando os nomes em um servidor de diretórios LDAP centralizado, por exemplo.

Arquivos de configuração da rede Oracle

Dependendo do modelo de configuração adotado na corporação, os computadores da rede poderão


utilizar os seguintes arquivos de configuração:

ldap.ora:
Localizado no cliente e no servidor de BD configurado para gerenciamento centralizado, este
arquivo contém os parâmetros necessários para acessar um servidor de diretórios;

Autor: Alcione Dias da Silva


77

listener.ora:
Localizado no servidor de BD, este arquivo contém:

- protocolos de endereçamento que o ouvidor aceita em uma requisição de conexão;

- serviços de BD e serviços diversos aos quais ele está “ouvindo”;

- parâmetros de controle que são utilizados pelo ouvidor.

Obs.: Ao configurar o ouvidor para “escutar” o protocolo TCP/IP, você deve utilizar a porta padrão
1521. Caso não utilize a porta padrão, deverá ser configurado o parâmetro LOCAL_LISTENER no
arquivo de parâmetros de inicialização (init.ora) e resolver o nome do ouvidor através de um
método de nomeação;

names.ora:
Localizado no servidor de nomes Oracle, este arquivo inclui a localização, informações de domínio
e parâmetros de configuração opcionais para o servidor de nomes Oracle;

tnsnames.ora:
Localizado apenas nos clientes, este arquivo contém os nomes dos serviços de rede mapeados para
o descritor de conexão. Este arquivo é utilizado apenas no método de nomeação local;

sqlnet.ora:
Localizado tanto nos clientes quanto no servidor de BD.

Todos estes arquivos são criados tipicamente em $ORACLE_HOME/network/admin em ambiente


UNIX / UNIX Like e em %ORACLE_HOME%\network\admin em ambiente Windows.

No entanto, é possível criar esses arquivos em outra localizações, pois a rede Oracle procura por
eles em vários locais.

A rede Oracle irá procurar os arquivos sqlnet.ora e ldap.ora na seguinte ordem:

1. No diretório especificado pela variável de ambiente TNS_ADMIN. Caso não tenha sido

Autor: Alcione Dias da Silva


78

definida como uma variável em ambiente Windows, deverá estar definida no registro (verificar
através do regedit);

2. Nos diretórios padrão, comentados acima, tanto em ambiente UNIX / UNIX quanto em
Windows.

A rede Oracle procurará os arquivos names.ora, tnsnames.ora e listener.ora na seguinte ordem:

1. No diretório especificado na variável de ambiente TNS_ADMIN, nas mesmas condições que


os arquivos sqlnet.ora e ldap.ora;

2. Em ambiente UNIX/ UNIX , no diretório de configuração global. Para um ambiente SUN


Solaris este diretório é /var/opt/oracle;

3. Nos diretórios padrão, comentados acima.

Conclusões:

Nesta segunda parte da série de artigos sobre conexão ao servidor de BD Oracle, podemos entender
os conceitos e terminologias utilizadas neste ambiente.

Este passo é extremamente importante para que não façamos o processo de configuração e conexão
mecanicamente. É essencial que entendamos os conceitos para que não seja necessário utilizar
“receitas de bolo”, que nem sempre dão certo. É nesses casos, em que a “receita de bolo” não
funciona, que saberemos onde “mexer” para solucionar os problemas.

Autor: Alcione Dias da Silva


79

Configuração do lado servidor

Veremos a configuração básica da rede Oracle no lado servidor.


Iremos identificar como o ouvidor (listener) responde aos pedidos de conexão e conheceremos mais
a fundo os três métodos de conexão ao servidor de BD Oracle.

O processo ouvidor (listener)


A aplicação cliente faz uma conexão inicial ao servidor de BD através do ouvidor (listener), que por
sua vez é um processo que “ouve” as requisições de conexão como representante de um ou mais
BDs. Algumas características do listener são:
* Um listener pode “ouvir” mais de um BD;
* Vários listeners podem “ouvir” um mesmo BD afin de promover balanceamento de carga;
* Um listener pode “ouvir” através de vários protocolos;
* O nome padrão do listener em uma rede Oracle é LISTENER;
* O nome do arquivo do listener deve ser listener.ora.

Métodos de conexão
Sempre que uma aplicação cliente faz um pedido de conexão para um servidor de BD, o listener
executa um dos seguintes métodos de conexão:

Geração e transmissão de conexão:


Neste método de conexão, o listener gera um processo servidor dedicado e transmite a conexão para
o processo servidor para que a conexão entre o cliente e o BD seja feita diretamente. Neste caso, é
executada a seqüência de eventos conforme mostrado na Figura 2.

Autor: Alcione Dias da Silva


80

1. Em primeiro lugar, o listener recebe o pedido de conexão vindo da aplicação cliente;


2. Após isso, o listener inicia um processo servidor dedicado e o mesmo herda o pedido de conexão
que veio do listener;
3. Finalmente, é estabelecida uma conexão direta entre o cliente e o processo servidor dedicado.
Se, caso haja uma limitação de sistema operacional ou protocolo, e a conexão não possa ser
transmitida entre dois processos na mesma máquina, deverá ser utilizado o método de conexão por
redirecionamento, que veremos adiante.
Lembro que, quando um cliente disconecta do servidor, o processo servidor dedicado daquele
cliente também é finalizado.

Conexão direta através do despachante:


Quando este método de conexão é utilizado, o listener usa o despachante (dispatcher) como um tipo
de manipulador de serviço, que atende diretamente às requisições do cliente. No momento que a
requisição do cliente é bem sucedida, é executada a seqüência de eventos conforme mostrado na
Figura 3.

Autor: Alcione Dias da Silva


81

1. O listener recebe o pedido de conexão da aplicação cliente;


2. Envia uma mensagem de redirecionamento para o cliente, informando o endereço de um
dispatcher;
3. O cliente finaliza a sessão de rede com o listener e estabelece uma sessão de rede com o
dispacher, utilizando-se do endereço de rede fornecido pela mensagem de redirecionamento.

Sessão de redirecionamento:
Quando encontramos ambientes que não suportam nenhum dos métodos anteriores de conexão, será
estabelecida uma sessão de redirecionamento, cujos passos estão mostrados na Figura 4.

1. A aplicação cliente estabelece uma conexão com o listener utilizando o protocolo configurado e
envia ao listener um pacote de conexão;
2. O listener verifica se o SID está definido. Em caso afirmativo, o listener irá gerar uma nova linha
ou processo para servir à nova conexão. Uma conexão IPC(comunicação entre processos) é
estabelecida entre o listener e o novo processo;
3. O novo processo seleciona a nova porta TCP/IP em uma lista de portas livres definidas pelo
usuário e retorna esta informação para o listener;
4. O listener coloca esta nova porta no pacote de redirecionamento e reenvia à aplicação cliente e a
conexão TCP original entre a aplicação cliente e o listener é recomposta;
5. Uma nova conexão TCP é estabelecida para o endereço especificado no pacote de
redirecionamento e o pacote de conexão é transmitido ao processo servidor dedicado ou ao
despachante, dependendo da configuração;
6. Finalmente, o processo servidor dedicado ou despachante aceita o pedido de conexão e transmite
uma mensagem de aceitação de volta à aplicação cliente.
A única diferença quando utilizamos despachantes ou processo servidor dedicado é que, para o
primeiro caso, se houver capacidade de conexão em algum despachante que já esteja no ar, não será
gerado e iniciado um novo despachante no passo 2.

Autor: Alcione Dias da Silva


82

Conclusões
Tivemos contato com a maneira pela qual o listener responde aos pedidos de conexão e
conhecemos mais profundamente os métodos de conexão utilizados em uma rede Oracle.

Estas informações são especialmente essenciais para detectar possíveis problemas de conexão e, em
muitos casos, descobrir que aquele problema que o usuário esta reclamando não está relacionado
com o BD e sim com a configuração de sua conexão.

Autor: Alcione Dias da Silva


83

Configurando o método de nomeação local(tnsnames.ora)


Chagamos no lado cliente da conexão ao BD Oracle.

Nesta última parte da série sobre conexões de rede, abordaremos o método de nomeação local que é
feito através de dois arquivos de configuração residentes no lado cliente, são eles o arquivo
tnsnames.ora e o arquivo sqlnet.ora

Vantagens do método de nomeação local

Podemos citar três grandes vantagens na utilização do método de nomeação local:

· É um método relativamente direto de resolver endereços de serviços;

· Possibilita resolver nomes de serviços de rede através de diferentes protocolos;

· Pode ser configurado facilmente através da ferramenta gráfica Net Manager.

Independente da maneira pela qual deseje configurar o método de nomeação local, todas as
configurações estarão armazenadas no arquivo tnsnames.ora, que é um arquivo do tipo texto puro
que pode ser editado em qualquer editor de texto, tanto em ambiente Windows quanto em ambiente
UNIX.

O arquivo tnsnames.ora

Como mencionado acima, o arquivo tnsnames.ora é utilizado para armazenar os nomes de serviço
de rede para que a estação de trabalho (cliente) consiga conectar-se ao servidor Oracle.

A localização padrão onde este arquivo fica gravado é:

· Em ambiente Windows: %ORACLE_HOME%\network\admin;

· Em ambiente UNIX: $ORACLE_HOME/network/admin;

Autor: Alcione Dias da Silva


84

NOTA: ORACLE_HOME é uma variável de ambiente que define a localização base de instalação
do Oracle.

A Listagem abaixo exibe um texto padrão encontrado em um arquivo tnsnames.ora.

SQLMAGAZINE =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS =
(PROTOCOL = TCP)(HOST = 192.168.10.25)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SQLMAGAZINE)
)
)
)

Descreveremos cada um dos parâmetros utilizados no arquivo tnsnames.ora (Tabela 1).


Parâmetro Descrição

SQLMAGAZINE (É o nome do serviço) Este é o nome dado para a sua entrada de


nomeação local. É ele que deverá ser usado no
momento da conexão com o BD.
Poderá ser definido qualquer nome desde que
não contenha espaços.

DESCRIPTION É a palavra chave para definir o descritor de


conexão. Todas as descrições serão
especificadas sempre desta mesma forma.

ADDRESS_LIST É a palavra chave que indica a lista de endereços


disponíveis.

ADDRESS Palavra chave para a especificação do endereço.


Para múltiplos endereços, basta manter uma
entrada ADDRESS para cada endereço e todos
dentro do mesmo ADDRESS_LIST.

Autor: Alcione Dias da Silva


85

PROTOCOL Define qual o protocolo de rede que está sendo


usado.

HOST Informação específica quando da utilização do


protocolo TCP/IP. Especifica o endereço IP do
servidor ou seu nome, caso deseje.

PORT Informação específica quando da utilização do


protocolo TCP/IP. Especifica o número da porta
na qual o listener está “escutando”, no lado
servidor.

CONNECT_DATA Especifica o nome do serviço de banco de dados


no qual se deverá conectar.
Habitualmente, utiliza-se o nome da entrada no
tnsnames.ora sendo o mesmo nome do serviço,
mas isso é apenas uma boa prática, não uma
regra.

SERVICE_NAME É o nome da instância ORACLE =


ORACLE_SID

Tabela 1. Parâmetros do arquivo tnsnames.ora.

O arquivo sqlnet.ora

O arquivo sqlnet.ora controla o comportamento do serviço de rede Oracle.

A localização padrão onde este arquivo fica gravado é:


· Em ambiente Windows: %ORACLE_HOME%\network\admin;
· Em ambiente UNIX: $ORACLE_HOME/network/admin;

NOTA

É possível alterar a localização padrão dos arquivos tnsnames.ora e sqlnet.ora apenas definindo
uma nova localização atribuindo-a à variável de ambiente TNS_ADMIN.
O arquivo sqlnet.ora possui apenas um parâmetro, NAMES.DIRECTORY_PATH, que define como
o serviço de rede Oracle irá resolver o nome do serviço definido no descritor de conexão. Você
poderá utilizar múltiplos métodos apenas representando-os em uma lista separada por ponto e
vírgula (;) e delimitadas por parênteses.

Autor: Alcione Dias da Silva


86

Caso múltiplos métodos sejam definidos, o serviço de rede irá resolver os nomes de serviço
utilizando a ordem da esquerda para a direita de definições dos métodos.
A linha abaixo exibe um conteúdo típico do arquivo sqlnet.ora.
NAMES.DIRECTORY_PATH = (TNSNAMES)

Após a configuração do método de nomeação e nomes de serviço de rede, você poderá conectar-se
a um servidor de banco de dados Oracle através de qualquer ferramenta cliente, como por exemplo
o SQL*Plus.

Solucionando problemas no lado cliente


Após todas as configurações executadas, é possível que algum ponto tenha passado despercebido e
uma mensagem de erro seja apresentada no momento da conexão.

Veja abaixo códigos e mensagens de erro relacionadas a problemas no lado cliente:


ORA-12154 “TNS: could not resolve service name”
ORA-12198 “TNS: could not find path to destination”
ORA-12203 “TNS: unable to connect to destination”
ORA-12533 “TNS: illegal ADDRESS parameters”
ORA-12541 “TNS: no listener”

A seguir as possíveis causas e as ações que poderão ser tomadas para solucionar os problemas:
ORA-12154 “TNS: could not resolve service name”
Causa:
O serviço de rede Oracle não pode localizar o descritor de conexão que está especificado no
arquivo tnsnames.ora.
Ações:
1. Verifique se o arquivo tnsnames.ora realmente existe e está acessível;
2. Tenha certeza que o arquivo tnsnames.ora está no mesmo local definido na variável de
ambiente TNS_ADMIN;
3. Verifique se o nome do serviço especificado na sua string de conexão está mapeado em um
descritor de conexão no arquivo tnsnames.ora;
4. Verifique se não existe uma cópia duplicada do arquivo sqlnet.ora;
5. Caso esteja tentando conectar-se através de uma caixa de diálogo de login, tenha certeza de
não estar usando o símbolo de arroba (@) antes do nome do serviço.

Autor: Alcione Dias da Silva


87

ORA-12198 “TNS: could not find path to destination”


ORA-12203 “TNS: unable to connect to destination”
Causa:
O cliente não pode encontrar o banco de dados desejado.
Ações:
1. Verifique se foi definido corretamente o nome do serviço de banco de dados que deseja
conectar;
2. Verifique se o parâmetro ADDRESS no descritor de conexão está correto;
3. Tenha certeza que o arquivo tnsnames.ora está no mesmo local definido na variável de
ambiente TNS_ADMIN;
4. Verifique se o listenter está inicializado e em execução. Caso não esteja, inicialize-o;
5. Caso esteja tentando conectar-se através de uma caixa de diálogo de login, tenha certeza de
não estar usando o símbolo de arroba (@) antes do nome do serviço.

ORA-12533 “TNS: illegal ADDRESS parameters”


Causa:
O protocolo especificado no parâmetro ADDRESS do seu descritor de conexão está incorreto.
Ação:
Verifique qual o protocolo de conexão correto e altere em seu descritor de conexão;

ORA-12541 “TNS: no listener”


Causa:
Não é possível contatar o listener no lado servidor.
Ação:
Verifique se o listenter está inicializado e em execução. Caso não esteja, inicialize-o.

Conclusões

Este assunto é de suma importância para o bom andamento das atividades de sua empresa
relacionadas com acesso ao banco de dados.

Muitas vezes, problemas triviais tornam-se grandes problemas pela falta de conhecimento na
maneira pela qual o Oracle trata as conexões entre as estações cliente e o servidor.

Autor: Alcione Dias da Silva


88

A velha prática de configuração através de ferramentas gráficas é bastante tranqüila e fácil, porém
limita os conhecimentos de cada parâmetro e cada conceito.

Autor: Alcione Dias da Silva


89

10 Objetos de um Banco de dados


Criando Sequences
Objetivos:

Muitas aplicações exigem o uso de números únicos como valores de chaves


primárias. Você pode incluir o código na aplicação para tratar este requisito ou usar
uma sequence para gerar números únicos. Nesta lição serão apresentadas como criar e
usar sequences que geram números únicos.

Objetivos:

• Explicar o uso de sequences.


• Criar uma sequence.
• Usar uma sequence.
• Alterar uma definição de sequence.
• Remover uma sequence.

Visão Geral:

Um gerador de sequences pode ser usado para criar automaticamente números de


sequence para linhas em tabelas. Uma sequence é um objeto de banco de dados
criado por um usuário e compartilhado por vários usuários.

Um uso típico para sequences é o de criar um valor de chave primária, que deve ser
única para cada linha. Uma sequence é gerada e incrementada(ou reduzida) por uma
rotina interna do ORACLE. Isto pode ser um objeto que economiza tempo, pois ele
pode reduzir a quantidade de códigos de aplicação necessários para escrever uma
rotina que gera sequences.

Números de sequence são armazenados e gerados independentemente de tabelas.


Portanto, a mesma sequence pode ser usada para várias tabelas.

Logo:
• Gera números únicos automaticamente.
• É um objeto compartilhável.
• É geralmente usada para criar um valor de chave primária.

Autor: Alcione Dias da Silva


90

• Substitui o código de aplicação.


• Acelera a eficiência de acesso aos valores da sequence quando mantida na
memória cache.

Criando uma Sequence

Defina uma sequence para gerar números seqüenciais automaticamente, usando o


comando CREATE SEQUENCE.

Sintaxe:

CREATE SEQUENCE sequence


[INCREMENT BY n]
[START WITH n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE]

onde:

sequence é o nome do gerador da sequence.

INCREMENT BY n especifica o intervalo entre números de sequence, onde n é


um número inteiro. Se essa cláusula for omitida, a sequence
será incrementada em 1.

START WITH n especifica o primeiro número de sequence a ser gerado. Se


essa cláusula for omitida, a sequence iniciará com 1.

MAXVALUE n especifica o valor máximo que a sequence pode gerar.

NOMAXVALUE especifica um valor máximo de 10(elevado a 27). Essa é a


opção default.

MINVALUE n especifica o valor mínimo da sequence.

NOMINVALUE especifica o valor mínimo como 1.

CYCLE | NOCYCLE especifica que a sequence continua a gerar valores após

Autor: Alcione Dias da Silva


91

chegar ao seu valor máximo ou mínimo ou não gera valores


adicionais. NOCYCLE é a opção default.

CACHE n | NOCACHE especifica quantos valores o ORACLE Server irá alocar e


manter na memória. Por default, o Server manterá 20
valores em cache.

Criando uma Sequence: Exemplo

• Crie uma sequence chamada departamento_id para ser usada na chave primária
da tabela departamento.
• Não use a opção CYCLE, se a sequence é usada para gerar valores de chaves
primárias.
• Inicie a sequence com 51.

SQL> CREATE SEQUENCE departamento_id


INCREMENT BY 1
START WITH 51
MAXVALUE 9999999
NOCYCLE
NOCACHE;

Confirmando sequences

Após criar uma sequence, ela é documentada no dicionário de dados. Como uma
sequence é um objeto do banco de dados, você pode identificá-la na tabela de
dicionário de dados USER_OBJECTS.

Você pode ainda confirmar as configurações da sequence ao selecioná-la na tabela de


dicionário de dados USER_SEQUENCES.

Exemplo:

Exibição de informação sobre todas as sequences das quais você é proprietário.

SQL> SELECT sequence_name, min_value, Max_value,


Increment_by, last_number
FROM user_sequences;

Autor: Alcione Dias da Silva


92

Usando uma sequence

Uma vez criada a sequence, você pode usá-la para gerar números seqüenciais para
uso nas tabelas. Faça referência aos valores de sequence usando as pseudocolunas
NEXTVAL e CURRVAL.

Pseudocolunas NEXTVAL e CURRVAL

A pseudocoluna NEXTVAL é usada para extrair números de sequence sucessivos a


partir de uma sequence especificada. Você deve qualificar NEXTVAL com o nome da
sequence. Quando você faz referência a sequence.NEXTVAL, é gerado um novo
número e o número atual é colocado em CURRVAL.

A pseudocoluna CURRVAL é usada para se referir a um número de sequence que o


usuário acaba de gerar. NEXTVAL deve ser usado para gerar um número de sequence
na sessão atual do usuário antes de se poder fazer referência a CURRVAL. Você deve
qualificar CURRVAL com o nome da sequence. Quando se faz referência a
sequence.CURRVAL, é exibido o último valor retornado para o processo daquele
usuário.

Regras para usar NEXTVAL e CURRVAL

Você pode usar NEXTVAL e CURRVAL:

• Na lista SELECT de um comando SELECT que não faz parte de uma


subquery.
• Na lista SELECT de uma subquery em um comando INSERT.
• Na cláusula VALUES de um comando INSERT.
• Na cláusula SET de um comando UPDATE.

Você não pode usar NEXTVAL e CURRVAL em:

• Uma lista SELECT de uma visão.


• Um comando SELECT com a palavra chave DISTINCT.
• Um comando SELECT com as cláusulas GROUP BY, HAVING ou ORDER
BY.
• Uma subquery em um comando SELECT, DELETE ou UPDATE.

Autor: Alcione Dias da Silva


93

• Uma expressão DEFAULT em um comando CREATE TABLE ou ALTER


TABLE.

Exemplo: Insira um novo departamento chamado FINANCEIRO na região 2.


SQL> INSERT INTO
departamento(id, nome, região_id)
VALUES (departamento_id.NEXTVAL,´FINANCEIRO´,2);
• Visualize o valor atual para a sequence.
SQL> SELECT departamento_id.CURRVAL from dual;

Usando uma sequence

Mantendo Valores de Sequence em Cache

Mantenha as sequences na memória cachê para permitir o acesso mais rápido aos
valores de sequence. A memória cache é preenchida na primeira referência a essa
sequence. Cada solicitação do próximo valor de sequence é recuperado a partir da
sequence na memória cache. Após a utilização da última sequence, a próxima
solicitação carrega outro cache de sequence na memória.

Intervalos na sequence

Embora geradores de sequence gerem números seqüenciais sem intervalos, essa ação
ocorre independentemente de um COMMIT ou de um ROLLBACK. Portanto, se
você desfizer um comando que contém uma sequence, o número será perdido.

Outro evento que pode causar intervalos em uma sequence é uma queda do sistema.
Se a sequence colocar valores na memória cache, esses valores serão perdidos se o
sistema cair.

Como as sequences não são diretamente vinculadas às tabelas, a mesma sequence


pode ser usada para várias tabelas. Se isto ocorrer, cada tabela pode conter intervalos
nos números seqüenciais.

Autor: Alcione Dias da Silva


94

Verificando o próximo valor da sequence disponível sem incrementá-lo.

É possível verificar o próximo valor de sequence disponível sem incrementá-lo,


apenas se a sequence foi criada com NOCACHE, consultando a tabela
USER_SEQUENCES.

Alterando uma sequence

Se você atingir o limite MAXVALUE para sua sequence, não serão alocados valores
adicionais para essa sequence e será emitida uma mensagem de erro indicando que a
sequence atingiu o MAXVALUE. Para continuar a usar a sequence, você pode alterá-
la usando o comando ALTER SEQUENCE.

Sintaxe:

ALTER SEQUENCE sequence


[INCREMENT BY n]
[MAXVALUE n | NOMAXVALUE]
[MINVALUE n | NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n | NOCACHE]

Regras Gerais:

• Você pode ser o proprietário da sequence ou ter privilégio ALTER para poder
alterá-la.
• Apenas números de sequence futuros são afetados pelo comando ALTER.
• Alguma validação pode ser executada. Por exemplo, um novo MAXVALUE
menor que o número da sequence atual não pode ser imposto.
• A opção START WITH não pode ser alterada usando ALTER SEQUENCE. A
sequence deve ser eliminada e recriada para reiniciar em um número diferente.

Autor: Alcione Dias da Silva


95

Removendo uma sequence

Para remover uma sequence do dicionário de dados, use o comando DROP


SEQUENCE. Você deve ser o proprietário da sequence ou ter privilégio DROP ANY
SEQUENCE para removê-la.

Sintaxe:

DROP SEQUENCE sequence;

Onde:

Sequence é o nome do gerador de sequence.

Autor: Alcione Dias da Silva


96

EXERCÍCIOS SOBRE SEQUENCES

1. Crie uma SEQUENCE para geração de valores para a chave primária da tabela
PESSOA_SINDICO do modelo do CONDOMINIO, está seqüência deverá ter
o Nro Inicial de 100 e valor máximo de 1.000.000.
2. Pesquise qual a tabela do dicionario de dados que traz informações sobre as
sequences, em seguida anote o último valor atribuido a cada sequence
encontrada.
3. Insira novos dados na tabela PESSOA_SINDICO utilizando na cláusula
values do comando INSERT a sequence criada no exercício Nro 1.

Autor: Alcione Dias da Silva


97

Criando Visões

Objetivos:

Nesta lição, você verá como as visões podem ser usadas para apresentar dados aos
usuários de diversos modos. Além disso, verá como constraints de integridade podem
ser forçadas se você estiver usando uma visão para inserir, atualizar ou deletar dados.

Objetivos:
• Explicar o conceito de uma visão.
• Usar visões do dicionário de dados.
• Criar visões simples e complexas.
• Criar uma visão com uma opção para forçar constraints.
• Alterar um visão.
• Remover uma visão.

Visão Geral:

Apresente subconjuntos lógicos ou combinações de dados criando visões de tabelas.

O que é uma visão?

Uma visão é uma tabela lógica baseada em uma tabela ou em outra visão. Uma visão
não contém dados próprios, mas , em vez disso, é como uma “janela” através da qual
dados de tabelas podem ser verificados ou alterados. As tabelas nas quais um visão é
baseada são chamadas de tabelas-base. A visão é armazenada como um comando
SELECT no dicionário de dados.

Vantagens das Visões:

• Limitam o acesso ao banco de dados, pois, a visão pode exibir uma parte
seletiva do banco de dados.
• Permitem que os usuários façam consultas simples para recuperar os
resultados de consultas complicadas. Por exemplo, visões permitem que

Autor: Alcione Dias da Silva


98

usuários pesquisem informações em várias tabelas sem saber como gravar


um comando join.
• Fornecer independência de dados para aplicativos e usuários. Uma visão
pode ser usada para recuperar dados de diversas tabelas.
• Permitem que grupos de usuários tenham acesso a dados de acordo com
seus determinados critérios.

Criando uma Visão

Crie uma visão construindo uma subquery dentro do comando CREATE VIEW.

Sintaxe:

CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW view


[(alias[alias das colunas]…)]
AS subquery
[WITH CHECK OPTION [CONSTRAINT constraint]]
[WITH READ ONLY]

onde:
OR REPLACE recria a visão se ela já existe

FORCE cria a visão, independentemente de existirem ou não


tabelas-base.

NO FORCE cria a visão apenas se há tabelas-base. Este é o


default.

View é o nome da visão.

Alias especifica nomes para as expressões selecionadas


pela consulta da visão. O número de apelidos (alias)
deve corresponder ao número de expressões
selecionadas pela visão.

Subquery é um comando SELECT completo, você pode usar


apelidos(alias) para as colunas na lista SELECT.

WITH CHECK OPTION especifica que apenas linhas acessíveis a visão

Autor: Alcione Dias da Silva


99

podem ser inseridas ou atualizadas. (precisa


satisfazer a cláusula WHERE)

Constraint é o nome da constraint CHECK OPTION.

WITH READ ONLY assegura que nenhuma operação DML possa ser
realizada nesta visão.

Regras Gerais:

• A consulta que define uma visão pode conter uma complexa sintaxe SELECT,
incluindo JOINS, grupos e subqueries.
• A consulta que define a visão não pode conter uma cláusula ORDER BY.
• Se você não especifica um nome de constraint, o sistema designará um nome
default no formato SYS_Cn.
• Você pode usar a opção OR REPLACE para alterar a definição da visão sem
eliminá-la ou recriá-la.

Há duas classificações para visões: simples e complexa. A diferença básica é


relacionada com operações DML.

Visões simples comparadas a visões complexas

Característica Visões Simples Visões


Complexas
Número de tabelas Apenas uma Uma ou mais
Contém funções Não Sim
Contém grupos de dados (DISTINCT ou Não Sim
funções de grupo)
DML através da visão Sim Não

Autor: Alcione Dias da Silva


100

Exemplo:
Criação de uma visão contendo número do funcionário, o sobrenome e título do cargo
para funcionários do departamento 30. Exibição do conteúdo.

SQL> CREATE VIEW emp30


AS SELECT empno, ename, job
FROM emp
WHERE deptno = 30;

SQL> SELECT * FROM emp30;

EMPNO ENAME JOB


----- ---------- ---------
7499 ALLEN SALESMAN
7521 WARD SALESMAN
7654 MARTIN SALESMAN
7698 BLAKE MANAGER
7844 TURNER SALESMAN
7900 JAMES CLERK

Criando e alterando uma visão

Controle os nomes de colunas incluindo apelidos(alias) de coluna dentro da subquery.

Exemplo:

Criação de uma visão contendo o número do funcionário(empno), nome(ename) com


o alias NOME DO FUNCIONÀRIO, cargo (job) com o alias CARGO e salário(sal)
com o alias SALÁRIO_MENSAL para o departamento 20.

SQL> CREATE VIEW emp20


AS SELECT empno, ename “NOME DO FUNCIONARIO”,
job CARGO, sal “SALARIO MENSAL”
FROM emp
WHERE deptno = 20;

Alternativamente, controle os nomes da coluna incluindo apelidos(alias) de coluna na


cláusula CREATE VIEW. Para alterar a definição da visão, use a cláusula CREATE
OR REPLACE.

Autor: Alcione Dias da Silva


101

Exemplo:

Alteração da visão emp30. Alteração do número do funcionário para ter


IDENTIFICAÇÃO no cabeçalho, nome e um cabeçalho EMPREGADO e título do
cargo (job) em um cabeçalho FUNÇÂO.

SQL> CREATE OR REPLACE VIEW emp30


(IDENTIFICAÇÃO, EMPREGADO, FUNÇÃO)
AS SELECT empno, ename, job
FROM emp
WHERE deptno = 30;

Nota: Quando estiver atribuindo apelidos (alias) de coluna na cláusula CREATE


VIEW, lembre que eles são listados na mesma ordem que as colunas da subquery.

Criando uma visão Complexa

Crie uma visão complexa que contenha funções de grupo para exibir valores de duas
tabelas.

Exemplo:

Criação de uma visão dos nomes de departamento, salário mínimo, salário máximo e
salário médio por departamento. Exibição da estrutura da visão e seu conteúdo.

SQL> CREATE VIEW deptotal


(DEPARTAMENTO,”SAL MIN”,”SAL MÁX”,”SAL MÉDIO”)
AS SELECT d.dname, min(e.sal), Max(e.sal), avg(e.sal)
FROM emp e, dept d
WHERE e.deptno = d.deptno
GROUP BY d.dname;

Autor: Alcione Dias da Silva


102

SQL> desc deptotal


Nome Nulo? Tipo
----------------------------------------- -------- ------------
DEPARTAMENTO VARCHAR2(14)
SAL MIN NUMBER
SAL MÁX NUMBER
SAL MÉDIO NUMBER

SQL> select * from deptotal;

DEPARTAMENTO SAL MIN SAL MÁX SAL MÉDIO


-------------- ---------- ---------- ----------
ACCOUNTING 1300 5000 2916,66667
RESEARCH 800 3000 2175
SALES 950 2850 1566,66667

Regras para realizar operações DML em uma visão

Você pode realizar operações DML em dados através de uma visão, contanto que
essas operações sigam as regras descritas abaixo:

• Você pode remover uma linha de uma visão, a não ser que contenha qualquer
das seguintes condições:
o Funções de grupo
o Um cláusula GROUP BY
o O comando DISTINCT
• Você pode alterar dados em uma visão, a não ser que ela contenha qualquer das
condições acima e um dos itens abaixo:
o Colunas definidas por expressões, por exemplo SALÁRIO*12.
o A pseudocoluna ROWNUM.
• Você pode incluir dados através de uma visão, a menos que ela contenha
qualquer das condições acima e que haja colunas NOT NULL na tabela-base
que não sejam selecionadas pela visão. Todos os valores exigidos devem estar
presentes na visão. Lembre-se que você está adicionando visões diretamente à
tabela básica através da visão.

Autor: Alcione Dias da Silva


103

Regras para realizar operações DML em uma visão

Usando a cláusula WITH CHECK OPTION

Você pode assegurar que os dados adicionados ou atualizados em uma visão simples
possam ser pesquisados através da visão.

Exemplo:

Criação de uma visão que contenha todas as colunas da tabela emp para o
departamento 10. Adicionar a cláusula WITH CHECK OPTION.

SQL> CREATE OR REPLACE VIEW emp10


AS SELECT *
FROM emp
WHERE deptno = 10
WITH CHECK OPTION CONSTRAINT emp10_ck;

Tente alterar o número do departamento para o empregado 7782 para o departamento


20 através da visão.

SQL> UPDATE emp10


SET deptno=20
WHERE empno= 7782;

ERRO na linha 1:
ORA-01402: violação da cláusula where da view WITH CHECK OPTION

Nota: Nenhuma linha foi atualizada porque se o número do departamento mudasse


para 20, a visão não poderia mais encontrar esse funcionário. Portanto, com a
cláusula WITH CHECK OPTION, a visão pode encontrar apenas funcionários do
departamento 10 e não permite que seja alterado o número do departamento para
esses funcionários através da visão.

Autor: Alcione Dias da Silva


104

Negando Operações DML

• Assegure que nenhuma operação DML ocorra, adicionando a opção WITH


READ ONLY à definição da visão.
• Se você tentar realizar um DML em qualquer linha na visão, ocorrerá o erro
ORA-01752 do ORACLE Server.

Exemplo:

Altere a visão emp30 para não permitir alterações.

SQL> CREATE OR REPLACE VIEW emp30


AS SELECT empno, ename, job
FROM emp
WHERE deptno = 30
WITH READ ONLY;

SQL> DELETE FROM emp30


WHERE empno= 7965;

ERRO na linha 1:
ORA-01752: não é possível a deleção a partir da view sem ter exatamente uma
tabela preservada pela chave

Autor: Alcione Dias da Silva


105

Confirmando Nomes e Estruturas de Visões

Você pode confirmar os nomes e comandos SELECT de definição de visões,


consultando a tabela do dicionário de dados USER_VIEWS.

Exemplo:

Descrição da estrutura da tabela do dicionário de dados USER_VIEWS. Exibição dos


nomes e do conteúdo de todas as visões atualmente pertencentes ao usuário.

SQL> DESCRIBE USER_VIEWS

Nome Nulo? Tipo


----------------------------------------- -------- --------------------
VIEW_NAME NOT NULL VARCHAR2(30)
TEXT_LENGTH NUMBER
TEXT LONG
TYPE_TEXT_LENGTH NUMBER
TYPE_TEXT VARCHAR2(4000)
OID_TEXT_LENGTH NUMBER
OID_TEXT VARCHAR2(4000)
VIEW_TYPE_OWNER VARCHAR2(30)
VIEW_TYPE VARCHAR2(30)
SUPERVIEW_NAME VARCHAR2(30)

SQL> SELECT view_name, text


FROM user_views;

Autor: Alcione Dias da Silva


106

Removendo uma Visão

Use o comando DROP VIEW para remover uma visão. O comando remove a
definição da visão do bando de dados. Eliminar visões não tem qualquer efeito nas
tabelas nas quais a visão foi baseada. Visões ou outras aplicações baseadas em visões
deletadas tornam-se inválidas. Apenas o criador ou um usuário com o privilégio
DROP ANY VIEW pode remover uma visão.

Sintaxe:

DROP VIEW view;

Onde:

View é o nome da visão.

Autor: Alcione Dias da Silva


107

EXERCÍCIOS DE VISÕES
REVER E REFAZER ESTES EXERCÍCIOS
1) Crie uma visão com o nome SINDICO baseada na tabela PESSOA_SINDICO ,
fazendo a restrição das pessoas que são SINDICAS. PAREI AQUI
a. Exiba o conteúdo da visão empregado_vu.
b. Escreva um script para exibir a definição de uma visão. Passe o nome da
visão para o script. Salve o script como cap7exer1Qb.sql. Execute o script
para verificar a definição da visão empregado_vu.
c. Altere o número do departamento de SMITH para 37 na visão
empregado_vu.
d. Confirme que SMITH agora está atribuído ao departamento 37.

2) Crie uma visão chamada MNS_VU que contenha o número, nome completo e
nome do departamento do funcionário para todos os funcionários dos
departamentos de MARKETING e VENDAS nas tabelas TRABALHADOR e
DEPARTAMENTO. Salve o comando em um script chamado de cap7exer2.sql.
a. Exiba a estrutura e o conteúdo da visão MNS_VU.
b. Exiba a definição da visão MNS_VU ao executar o script cap7exer1Qb.sql.
c. Exiba o nome do departamento e o número de funcionários em cada
departamento.

3) Altere a visão EMPREGADO_VU para que contenha apenas os funcionários do


departamento 37. Adicione uma constraint de verificação para que o número do
departamento não possa ser alterado.
a. Exiba o conteúdo da visão empregado_vu.
b. Altere o número do departamento de SMITH de volta para 54 através da
visão EMPREGADO_VU. Sua operação obteve êxito? Sim ou Não e por
quê?

4) Altere MNS_VU para que as linhas possam ser verificadas apenas entre 1:00 P.M.
e 4:00 P.M. Você pode editar o script chamado de cap7exer2.sql. Execute o script.
Exiba o conteúdo da visão.

5) Remova todas as visões do dicionário de dados. Confirme se não há qualquer


visão no dicionário de dados.

Autor: Alcione Dias da Silva


108

Criando Índices
Objetivos:

Se você deseja melhorar o desempenho de algumas consultas, deve considerar a


criação de um índice. Você também pode usar índices para forçar a unicidade em
coluna ou em uma coleção de colunas.

Ao final desta lição, você estará apto a

• Distinguir os índices criados automaticamente e manualmente.


• Identificar usos para os índices.
• Explicar a estrutura do índice e porque ele melhora a velocidade da consulta.
• Criar um índice não-único.
• Avaliar regras gerais para a criação e uso de índices.

Visão Geral:

Um índice no ORACLE Server é um objeto de banco de dados que pode acelerar a


recuperação de linhas usando um ponteiro. Índices podem ser criados explícita ou
automaticamente. Eles são transparentes ao usuário. Se você não tiver um índice na
coluna, ocorrerá um rastreamento por toda a tabela.

O que é um Índice

Um índice é um objeto de banco de dados que fornece acesso direto e rápido às linhas
em uma tabela. Seu propósito é o de reduzir a necessidade de I/O no disco usando
caminho indexado B*tree para localizar dados rapidamente. O índice é usado
automaticamente e mantido pelo ORACLE Server. Uma vez criado o índice, não é
necessária qualquer atividade direta pelo usuário.

Índices são lógica e fisicamente independentes da tabela que indexam. Isto significa
que eles podem ser criados ou eliminados a qualquer momento, sem qualquer efeito
nas tabelas-base ou em outros índices.

Autor: Alcione Dias da Silva


109

Como os índices são criados

Podem ser criados dois tipos de índices. Um dos tipos é o índice único. O ORACLE
Server cria automaticamente este índice quando você define uma coluna em uma
tabela para ter uma constraint PRIMARY KEY ou UNIQUE. O nome do índice é o
nome dado à constraint.

O outro tipo de índice que um usuário pode criar é um índice não-único. Por
exemplo, você pode criar um índice de coluna FOREIGN KEY para um join em uma
consulta para melhorar a velocidade de recuperação.

Quando é usado um índice?

Uma vez que o índice é criado , o ORACLE Server o usará sempre que possível para
acelerar o acesso aos dados. Observe que este uso é automático e geralmente não
requer ação pelo usuário.

Técnicas de Otimização

Quando um índice é usado dependerá parcialmente do Oracle Optimizer em uso


naquele momento. O Oracle Server usa ambas otimizações: tanto a baseada em
regras, como também baseada em custo.

A otimização baseada em regras ocorre quando o Oracle Server decide quando é


apropriado usar um índice utilizando suas regras internas. O Server identifica as
colunas que são indexadas e os tipos de índice.

O método de otimização baseado em custo usa estatísticas sobre tabelas juntamente


com informações sobre índices disponíveis para selecionar um plano de execução
para os comandos SQL.

Autor: Alcione Dias da Silva


110

Estrutura de um índice

Um índice é uma estrutura opcional que é independente da estrutura da tabela. Cada


índice é composto de valores de coluna que contêm o índice e de ponteiros (ou
ROWIDs) para a linha que contém o valor. O ponteiro aponta diretamente para a
linha apropriada na tabela, evitando assim um rastreamento por toda a tabela.

B*Tree

O Oracle Server usa uma estrutura de índice balanceada B*Tree. É uma estrutura de
pesquisa binária auto-balanceadora para equalizar as vezes de acesso a qualquer
linha. È um método eficiente de assegurar que o acesso a qualquer valor especificado
leve aproximadamente o mesmo tempo para ser efetivado, esteja a linha no início,
meio ou fim de uma tabela.

Cada índice que o ORACLE Server constrói consiste em diversas páginas (ou
ramificações) de armazenamento organizadas em uma árvore. Cada página(ou
ramificação) retém uma série de valores-chave e ponteiros a páginas (ou ramos)
abaixo na estrutura até que por fim os valores-chave indiquem o local do próprio
dado. O identificador de local no nível do banco de dados é chamado de ROWID.

Estrutura de índice

Tipos de índice
Tipo Descrição
Único Assegura que os valores nas colunas especificadas sejam únicos.
Não-Único Assegura os mais rápidos resultados durante a consulta aos
dados.
Coluna Simples Há apenas uma coluna no índice.
Concatenado ou Pode conter até 16 colunas no índice para propósitos de
Composto desempenho ou de verificação de unicidade. As colunas não
precisam ser adjacentes.

Nota: os tipos de índices não são mutuamente exclusivos. Por exemplo, você pode
criar um índice único, concatenado.

Autor: Alcione Dias da Silva


111

Criando um índice

Crie um índice em uma ou mais colunas emitindo o comando CREATE INDEX.

Sintaxe abreviada:

CREATE INDEX index


ON table (column[, column]…);

Onde:

Index é o nome do índice.


Table é o nome da tabela.
Column é o nome da coluna na tabela a ser indexada.

Exemplo:

Crie um índice para melhorar a velocidade do acesso da consulta na coluna


sobrenome na tabela empregado.

SQL> CREATE INDEX empregado_sobrenome_idx


ON empregado(sobrenome);

Autor: Alcione Dias da Silva


112

Criando um índice

Mais não significa Melhor

Ter mais índices em uma tabela não significa que as consultas serão mais rápidas.
Cada operação DML vinculada a índices em uma tabela significa que o índice deve
ser atualizado. Quanto mais índices associados a uma tabela, maior será o trabalho de
Server para atualizar todos os índices após um DML.

Regras gerais para criação de um índice

• A coluna é usada freqüentemente na cláusula WHERE ou em uma condição de


JOIN.
• A coluna contém um grande número de valores.
• A coluna contém um grande número de valores nulos.
• Duas ou mais colunas são freqüentemente usadas juntas em uma cláusula
WHERE ou em uma condição de JOIN.
• A tabela é grande e a maioria das consultas deve recuperar menos de 2 a 4% da
linhas.
• Mais índices nem sempre significam consultas mais rápidas.

Não devemos criar um índice:

• A tabela for pequena.


• As colunas não forem usadas freqüentemente como uma condição na consulta.
• A maioria das consultas tiver que recuperar mais de 2 a 4% das linhas.
• A tabela for atualizada freqüentemente.

Autor: Alcione Dias da Silva


113

Confirmando índices

Confirme a existência de índices a partir da visão do dicionário de dados


USER_INDEXES. Você pode ainda verificar as colunas envolvidas em um índice
consultando a visão USER_IND_COLUMNS.

Exemplo:

Exibição de todos os índices criados anteriormente, os nomes de colunas afetadas e a


unicidade na tabela empregado.

SQL> SELECT ic.index_name, ic.column_name,


Ic.column_position col_pos, ix.uniqueness
FROM user_indexes ix, user_ind_columns ic
WHERE ic.index_name = ix.index_name
AND ic.table_name = ‘EMPREGADO’;

INDEX_NAME COLUMN_NAME COL_POS UNIQUENESS


--------------- --------------- ---------- ---------------
EMPREGADO_ID_PK ID 1 UNIQUE
EMPREGADO_SOBRE SOBRENOME 1 NONUNIQUE
NOME_IDX

Autor: Alcione Dias da Silva


114

Removendo um índice

Você não pode modificar índices. Para fazê-lo, você deve eliminá-lo e então recriá-lo.
Remova uma definição de índice do dicionário de dados emitindo o comando DROP
INDEX. Para remover um índice, você deve ser seu proprietário ou ter o privilégio
DROP ANY INDEX.

Sintaxe:

DROP INDEX index;

Onde:

Index é o nome do índice.

Autor: Alcione Dias da Silva


115

EXERCÍCIOS DE ÍNDICES
REVER E REFAZER ESTES EXERCÍCIOS
1) Poderiam os índices especificados serem usados com as seguintes consultas e por
quê?
a. Índice não-único em sobrenome?
• SELECT *
FROM empregado
WHERE sobrenome = ‘Biri’;

b. Índice único em id e índice não-único em cilente_id?


• SELECT id, cliente_id, total
FROM pedido
WHERE data_pedido = ’31-aug-92’;

c. Índice único em departamento.id e índice não-único em


empregado.departamento_id?
• SELECT e.sobrenome, d.nome
FROM empregado e, departamento d
WHERE e.departamento_id = d.id;

2) Crie um índice não único em uma coluna de chave estrangeira na tabela


trabalhador.

3) Como os usuários freqüentemente consultarão o sobrenome do funcionário, crie


um índice não-único naquela coluna da tabela trabalhador.

4) Exiba os índices e a unicidade que há no dicionário de dados para as tabelas


TRABALHADOR e DEPARTAMENTO. Salve o comando em um script
chamado cap8exer4.sql.

5) Remova a constraint de chave primária na tabela TRABALHADOR.

6) Reexiba os índices e a unicidade que há no dicionário de dados para as tabelas


TRABALHADOR e DEPARTAMENTO ao executar o script cap8exer4.sql.
Quais alterações você observa e por quê?

7) Crie novamente a constraint de chave primária na tabela TRABALHADOR.


Confirme a constraint no dicionário de dados ao executar cap5exer2.sql. Confirme
o índice único no dicionário de dados ao executar cap8exer4.sql.

Autor: Alcione Dias da Silva


116

8) Remova o índice do sobrenome do funcionário na tabela TRABALHADOR.

Autor: Alcione Dias da Silva


117

Triggers

Autor: Alcione Dias da Silva


118

Store Procedures

Autor: Alcione Dias da Silva


119

11 Backup e Recovery
Conceito
BACKUP é uma cópia de dados do seu banco de dados local ou remoto, no entanto, essa cópia
pode incluir partes importantes do seu banco de dados, como por exemplo, arquivos de controle e
datafiles. Na prática seria uma réplica dos dados originais atual guardados em um outro lugar mais
seguro, pois se tiver algum acidente ou erro fatal nas aplicações do seu sistema, você terá seus
valiosos dados perdidos, numa empresa de grande porte isso pode ocorrer constantemente. No
Oracle podemos fazer dois tipos de BACKUPs, os backups físicos e os backups lógicos.

RECOVERY, como o próprio nome diz (RECOVERY = RECUPERAÇÃO), é a recuperação dos


arquivos do sistema, quando fazemos um Backup, nós fazemos uma cópia dos dados para um outro
lugar, físico ou virtual, e com o Recovery nós iremos recuperar esses dados para dentro da base de
dados, voltando a forma que estava antes do problema. É válido lembrar que fazer um backup ou
recovery são tarefas, que algumas vezes são bem complicadas.

backup físico
Envolvem a copia dos arquivos que constituem o banco de dados. O Oracle suporta 2 tipos de
backups físicos, são eles os backups online(quente) e offline(frio), podemos usar o utilitário RMAN
para nos auxiliar nesse tipo de backup. Opcionalmente, podemos optar por escrever nossos próprios
scripts de backup físico.

backup lógico
O famoso EXP/IMP é um tipo de backup que não se preocupa com a parte física do banco de dados,
ele apenas envolve a leitura de um conjunto de registros do banco de dados e a gravação destes em
um arquivo. O Data Pump Export do Oracle consulta o banco de dados e o dicionário de dados, e
grava a saída em um arquivo XML chamado arquivo de dump de exportação. Podemos exportar
todo o banco de dados, com um export full, ou podemos apenas exportar 1 ou 2 tabelas, ou um
shema inteiro, depende do objetivo de cada um. Lembrando que a importação poderá ser feita em
qualquer momento, e poderá escolher também o que será importado.

Autor: Alcione Dias da Silva


120

Backup Off-line (Backup Frio)


Com o banco off-line(fechado) devemos fazer o backup de todos os arquivos de dados, controles,
de todos os log de red-online, do arquivo init.ora, do arquivo de parâmetro de servidor(spfile),
arquivo de senhas, etc.

Backup Online (Backup Quente)


Para esse tipo de backup devemos verificar se o ARCHIVELOG está on, com esse parâmetro
saberemos se o archive log esta ativado ou não. Com o banco aberto devemos fazer o backup de
todos os arquivos de dados, todos os arquivos de log, de redo arquivados, arquivo de senhas, etc.

Objetivos:
•Proteger o banco de dados de inúmeros tipos de falhas
•Aumentar o Tempo Médio entre falhas (MTBF)
•Diminuir o Tempo Médio de Recuperação (MTTR)
•Minimizar a perda de dados
•Manter a Integridade das Informações
•Prover Alta Disponibilidade

Exemplo de scritp para geração de um backup físico com database fechado.

(Backup Frio – Base de dados desmontada):


conn sys as sysdba
set heading off
set pagesize 0
set verify off
set feedback off
set echo off
set linesize 200
spool c:\backup.lst
REM COPIANDO OS DATAFILES
select 'copy '||name||' c:\PastaDeBackup' from v$datafile;
REM COPIANDO OS CONTROLFILES
select 'copy '||name||' c:\PastaDeBackup' from v$controlfile;
REM COPIANDO OS ARQUIVOS DE REDO
select 'copy '||MEMBER||' c:\PastaDeBackup' from v$logfile;
REM COPIANDO O ARQUIVO DE SENHA DO USUARIO SYS
select 'copy C:\oracle\ora92\bin\orapwd c:\PastaDeBackup' from dual;
REM COPIANDO O ARQUIVO DE INICIALIZACAO DO BD
select 'copy C:\oracle\admin\alcione\pfile\init.ora c:\PastaDeBackup' from
dual;
spool off
set feedback on
set heading on
set echo on
set verify on

Autor: Alcione Dias da Silva


121

Passos para geração de um backup físico com database aberto (procedimento manual)

(Backup Quente – Base de dados montada, sistemas em Produção):

NO BANCO DE DADOS:
1) conn sys as sysdba
2) alter tablespace CONTABILIDADE begin backup;

NO SISTEMA OPERACIONAL:
3) copy c:\oracle\oradata\scamilo\CONTABILIDADE.ora c:\PastaDeBackup
NO BANCO DE DADOS:
4) alter tablespace user_data end backup;
5) alter system switch log file;

OBSERVAÇÃO:
Os passos de 1 a 5 apresentados devem ser repetidos para todos os tablespaces, incluindo o System, temporário,
segmentos de rollback, etc

NO BANCO DE DADOS:
Criando uma imagem binária
6) alter database backup controlfile to ‘control1.bkp´

7) Identificando controlfiles, redologs, arq. de senha, redo arquivados e arq. de inicialização para cópia.

REM COPIANDO OS CONTROLFILES


select 'copy '||name||' c:\PastaDeBackup' from v$controlfile;
REM COPIANDO OS ARQUIVOS DE REDO
select 'copy '||MEMBER||' c:\PastaDeBackup' from v$logfile;
REM COPIANDO O ARQUIVO DE SENHA DO USUARIO SYS
select 'copy C:\oracle\ora92\bin\orapwd c:\PastaDeBackup' from dual;
REM COPIANDO OS REDOLOGS ARQUIVADOS
select 'copy C:\oracle\ora92\SCAMILO\ARCHIVES\* c:\PastaDeBackup' from dual;
REM COPIANDO O ARQUIVO DE INICIALIZACAO DO BD
select 'copy C:\oracle\admin\alcione\pfile\init.ora c:\PastaDeBackup' from
dual;

Autor: Alcione Dias da Silva


122

Exercícios de Backup e Recovery

1) Faça uma pesquisa na internet para obter informações acerca dos utilitários
IMP e EXP, a fim de executar um backup lógico. Em seguida utilize tais
utilitários para realizar uma exportação do esquema do usuário ALUNO e
importar no SCHEMA do usuário ALUNO2.
2) Faça uma exportação apenas da tabela PESSOA_SINDICO.
3) Faça uma exportação apenas da tabela ENDEREÇO, sem levar os registros.
4) Faça uma exportação de toda a base de dados da instância SCAMILO.

Autor: Alcione Dias da Silva

Você também pode gostar