domingo, 10 de março de 2013

Database - Namespaces

Neste post falarei sobre Namespaces, um conceito simples mas importante para dominar a nomenclatura de objetos.

Namespace é um espaço imaginário composto por um ou mais tipos de objetos. Ele pode pertencer ao banco de dados como um todo, a um schema ou até mesmo a um tipo de objeto do schema. Ele é gerenciado automaticamente pelo SGDB, não pode ser criado, alterado ou eliminado. Sua função é restringir o nome dos objetos no banco de dados.

Segue abaixo uma figura extraída de um livro de Steve O'Hearn que apresenta como são divididos os namespaces.
Os Index e Constraints possuem um namespace próprio dentro de cada schema, já Tables, Views, Sequences, Private Synonyms e User-Defined Types compartilham o mesmo namespace em cada schema. Com isto pode-se dizer que é possível ter um  table abc, com um index abc e uma constraint abc no schema_1 e outra table abc, com index abc e constraint abc no schema_2, porém em nenhum destes schemas seria possível criar uma view abc pois já possuem um table abc. Users, Roles e Public Synonyms pertencem a um namespace único para todo Database, ou seja não é possível ter uma role xyz se já houver um user xyz.

sábado, 9 de março de 2013

Database - Nomenclarutra dos objetos

Neste post apresentarei algumas regras para a nomenclatura dos objetos no banco de dados Oracle.
Todos os objetos no banco de dados, até mesmo as colunas das tabelas, deverão ser nomeados de acordo com as seguintes regras.
  • Minimo 1 caractere;
  • Máximo 30 caracteres;
  • O primeiro caractere deve ser uma letra;
  • Além de número e letras, apenas os caracteres especiais  "$", "_" e "#" são permitidos. 
  • Acentuação não é permitida.
  • Não podem coincidir com as palavras reservadas (CREATE, TABLE, COLUMN, NUMBER, FROM, SELECT...)
  • Ser único no namespace do objeto.
Outro aspecto que vale citar aqui é a diferenciação de maiúsculas e minúsculas, mais conhecido por Case insensitive/Case sensitive. Por padrão, todos objetos são criados de forma Case Insensitive, ou seja, o objeto pode ser referenciado sem a diferenciação de maiúsculas e minúsculas. Porém, também é possível criar objetos com nomes no estilo case sensitive. Não vejo nenhum beneficio em utilizar nomeclatura em formato case sensitive, mas é importate conhecer como funciona. Abaixo demonstrarei com fazer isto.

Criarei uma tabela simples, observe que a primeira letra é maiúscula e o restante minúsculo. Também utilizei números e um caracter especial apenas para enfatizar que eles podem ser utilizados.
SQL> create table Tabela123# (id number(4), descricao varchar2(50));

Table created.

Agora, vamos ver como ela foi criada pelo banco.
SQL> select table_name from user_tables where table_name='Tabela123#'; 

no rows selected

SQL> select table_name from user_tables where table_name='TABELA123#';

TABLE_NAME
------------------------------
TABELA123#

Ok, o banco criou em tudo maiusculo. Mas vamos fazer um teste selecionando a tabela de diversas formas.
SQL> select count(*) from tabela123#;

  COUNT(*)
----------
         0

SQL> select count(*) from TABELA123#;

  COUNT(*)
----------
         0

SQL> select count(*) from Tabela123#;

  COUNT(*)
----------
         0
Ótimo, está case insensitive. Os SQL funcionaram tanto para maiúsculo quanto minúsculo.

Agora vou mostrar como criar uma tabela com nome no estilo case sensitive. Fazer isto é muito simples, basta utilizar aspas duplas no nome do objeto.
SQL> create table "Tabela456#" (id number, descricao varchar2(30));

Table created.

SQL> select table_name from all_tables where upper(table_name) like 'TABELA%';

TABLE_NAME
------------------------------
TABELA123#
Tabela456#

Quando se utiliza esta forma de nomeclatura para o objeto, o mesmo deve ser sempre referenciado utilizando aspas duplas, caso contrário o banco irá retornar ORA-00942 informando que o objeto nao foi encontrado.
SQL> select * from Tabela456#;
select * from Tabela456#
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select * from TABELA456#;
select * from TABELA456#
              *
ERROR at line 1:
ORA-00942: table or view does not exist


SQL> select * from "Tabela456#";

no rows selected


As regras que apresentei são válidas para outros objetos do banco, como View, Procedure, Function, Synonym, Package, Triggers e etc. Procure utilizar um padrão de nomenclatura para todo o sistema e sempre da forma mais intuitivo possível, isto facilitará a manutenção no futuro.

segunda-feira, 25 de fevereiro de 2013

Database - Objetos

O Oracle Database possui um grande número de tipos de objetos. Boa parte deles é vista diariamente na manutenção/desenvolvimento de programas. Porém alguns deles são raramente utilizados, acho importante conhece-los mesmo que superficialmente.

Descrevi brevemente cada um dos objetos do Oracle Database 11g. Eles estão divididos em Schema onde são pertencentes a um schema e Nom-Schema onde pertencem ao database inteiro.

Conforme o Manual de referências SQL da Oracle, a versão 11g possui os seguintes:
Objetos de Schema
Cluster
Armazena os registros de uma ou mais tabelas, na qual possuem uma ou mais colunas em comum.
Constraints
São regras para restringir valores nas tabelas, se dividem em seis categorias, são elas: Not null, unique, primary key, foreing key, check, REF.
Database links
Ligação entre databases. Com ele é possível acessar informações em outros bancos de dados.
Database triggers
Triggers ou Gatilhos que são disparados em determinados eventos.
Dimensions
Objeto para categorizar dados, utilizado em data warehouses.
External procedure libraries
Bibliotecas externas (DLL) que executam códigos em outras linguagens, em determinados casos podem ser mais rápidos do que se fossem criados em PL/SQL. 
Index-organized tables
Tabelas que possuem o armazenamento das linhas organizados por índice.
Indexes
Indice para localizar um registro em uma tabela.
Indextypes
Customizar tipos de índice, especificando rotinas para gerenciar o Domain Index.
Java classes, Java resources, Java sources
Objetos Java armazenados no banco de dados.
Materialized views
Views que mantém o resultado de uma query e são atualizadas com uma determinada frequência.
Materialized view logs
Tabela de referência sobre as alterações em tabelas master de uma view materializada. São utilizadas para atualização de views materializadas.
Mining models
Para utilização em Data Mining
Object tables
Tabelas com colunas do tipo de object types.
Object types
Tipos de dados criado pelo usuário (desenvolvedor do programa), também conhecido como user-defined type.
Object views
Consultas nomeadas para tabelas user-defined type
Operators
Operações utilizadas para manipular dados, podem ser user-defined.
Packages
Pacotes contendo types, variáveis, procedures, functions.
Sequences
Sequenciador bastante utilizado em primary key.
Stored functions, stored procedures
Blocos PL/SQL nomeados, sendo funções retornando um valor ou procedures retornando ou não um ou mais valores.
Synonyms
Sinonimo para algum objeto do banco.
Tables
Formada por colunas definidas e linhas de registros.
Views
Consultas nomeadas. Também podem ser utilizadas para operações de insert, update ou delete.

Objetos Non-Schema
Contexts
Atributos para uso nas aplicações para separação de dados e aumento da segurança.
Directories
Mapeamento no banco para um diretório do SO.
Editions
Versões de objetos no banco.
Restore points
Nomeia uma SCN (System Change Number) para utilizar futuramente em operações de flashback.
Roles
Conjunto de permissões.
Rollback segments
Mantem dados originais que foram alterados recentemente.
Tablespaces
Formada por datafiles, são espaços onde os dados dos objetos são mantidos.
Users
Usuários do banco de dados.

Bom, como podem ver fui realmente sucinto da descrição dos objetos. Futuramente criarei posts específicos com alguns deles.

Hello world

Estou iniciando este pequeno blog com intuito de registrar algumas experiências e desafios do mundo Oracle.