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.
domingo, 10 de março de 2013
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.
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.
Agora, vamos ver como ela foi criada pelo banco.
Ok, o banco criou em tudo maiusculo. Mas vamos fazer um teste selecionando a tabela de diversas formas.
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.
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.
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.
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#
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. COUNT(*)
----------
0
SQL> select count(*) from TABELA123#;
COUNT(*)
----------
0
SQL> select count(*) from Tabela123#;
COUNT(*)
----------
0
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#
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
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.
Assinar:
Postagens (Atom)