26 de mai. de 2021

Objetos do Banco de Dados

Basicamente o banco de dados possui 2 tipos de objetos: Objetos de schemas e objetos que não são de schemas.

Schema Objects

    Os objetos de schemas são objetos atrelados ao schema do usuário, lembrando que um schema é de propriedade de um usuário que tem o mesmo nome que o schema, e cada usuário é dono de apenas um schema. Os objetos de schema ficam armazenados dentro do schema.

Nota: Embora muitas vezes se confunda usuário com schema, pois tem o mesmo nome, não são a mesma coisa.

Quais são os objetos de schema?

  • Analytic views
  • Attribute dimensions
  • Clusters
  • Constraints
  • Database links
  • Database triggers
  • Dimensions
  • External procedure libraries
  • Hierarchies
  • Index-organized tables
  • Indexes
  • Indextypes
  • Java classes
  • Java resources
  • Java sources
  • Join groups
  • Materialized views
  • Materialized view logs
  • Mining models
  • Object tables
  • Object types
  • Object views
  • Operators
  • Packages
  • Sequences
  • Stored functions
  • Stored procedures
  • Synonyms
  • Tables
  • Views
  • Zone maps

Nonschema Objects

  Os nonschema objects ou objetos fora de schema, são objetos que são armazenados diretamente em banco de dados, o que não impede que sejam criados e manipulados por SQL. Abaixo lista de objetos sem schema.

  • Contexts
  • Directories
  • Editions
  • Flashback archives
  • Lockdown profiles
  • Profiles
  • Restore points
  • Roles
  • Rollback segments
  • Tablespaces
  • Tablespace sets
  • Unified audit policies
  • Users

Regras para nomear Objetos e Qualificadores

    Alguns objetos podem ter seu nome criado de forma sistema pelo banco de dados, contudo, muitos objetos exigem que o usuário faça a nomeação, por exemplo tabelas e colunas. Para realizar essa nomeação existem algumas regras e restrições. Objetos que iniciam com SYS_ ou ORA_ se tratam de objetos do sistema de banco de dados.

    Durante a nomeação de um objeto temos 2 maneiras para fazer a nomeação que são utilizando aspas (") ou sem a utilização de aspas. O que isso muda no uso de um objeto? Quando a nomeação é feita com a utilização de aspas é necessário utilizar aspas para referenciar esse objeto que também se torna sensível aos caracteres maiúsculos ou minúsculos.

Exemplos:

Foi criada uma tabela com nome referenciando e realizado um insert na tabela referenCIANDO, após foi criado uma nova tabela utilizando aspas que se chama referenCIANDO, seguido por mais 2 comandos inserts, um com o nome do objeto entre aspas duplas e outro não.

    Após a criação das tabelas e as inserções, foram realizados consultas em ambas, pode ser notado que apenas 1 dos comandos inserts foi realmente inserido na tabela de nome "referenCIANDO", enquanto o banco de dados entende que sem aspas, REFERENCIANDO é igual referenciando ou qualquer outra combinação das letras entre maiúsculas e minúsculas.


Sabendo que existem essas diferenças para as nomenclaturas, vamos ver as demais regras.

Regra 1 - Tamanhos

Os tamanhos variam de acordo com a configuração do parâmetro COMPATIBLE, mas podem ser de 1 até 30 bytes ou de 1 até 128 bytes, tendo 2 exceções:
  • nome do banco de dados é limitado em 8 bytes;
  • nomes de diskgroups, pdbs, rollback segments, tablespaces e tablespace sets são limitados em 30 bytes.

Regra 2 - Palavras reservadas

Palavras reservadas não podem ser utilizadas como nome de objetos, a exceção é que podem ser utilizadas desde que declaradas fazendo o uso de aspas duplas (").

Regra 3 - Palavras especiais

    No SQL algumas palavras não são reservadas, porem são utilizadas em sintaxes e comandos, essas palavras podem ser utilizadas, embora não seja recomendado, pois podem causar confusão ao analisar um comando, por exemplo.
Algumas dessas palavras são: DIMENSION, SEGMENT, ALLOCATE, DISABLE.
A listagem completa de palavras reservadas e palavras utilizadas no SQL, podem ser encontradas através de uma consulta na view V$RESERVED_WORDS.

Regra 4

    Devem ser utilizados caracteres ASCII para nomes de banco de dados, nomes de links de banco de dados e global name do banco de dados, devido a compatibilidade entre sistemas operacionais. Da mesma maneira em CDBs devem ser utilizados apenas caracteres ASCII para nomes comuns de usuários, roles e profiles.

Regra 5

Caracteres multibytes podem ser incluídos nas senhas. Mais informações podem ser vistas neste link.

Regra 6 

    Nomes que não utilizam aspas duplas devem iniciar com caracteres alfabéticos, enquanto nomes que utilizam aspas duplas podem iniciar com qualquer caractere.

Regra 7 - Caracteres Especiais e pontuação

    Nomes que utilizem aspas duplas suportam os caracteres especiais _ $ e #, desde que não sejam o primeiro caractere.
    Para links de bancos de dados também são suportados . e @, também não é indicado o uso de $ e # nesses casos.
    Para nomes que utilizam aspas duplas nas declarações não há restrições no uso de caracteres especiais, pontuação ou espaços em branco.
    Em ambos os casos não é permito o uso do caractere null (\0).

Regra 8 - Nomes duplicados

    Não é permito que dois objetos tenham o mesmo nome dentro do mesmo namespace.
Objetos que compartilham o mesmo namespace:
  • Packages
  • Private synonyms
  • Sequences
  • Stand-alone procedures
  • Stand-alone stored functions
  • Tables
  • User-defined operators
  • User-defined types
  • Views
Objetos que tem seu próprio namespace:
  • Clusters
  • Constraints
  • Database triggers
  • Dimensions
  • Indexes
  • Materialized views * 
  • Private database links

    Com base nessas informações, podemos entender que não é possível uma sequência e uma tabela possuam o mesmo nome, embora uma tabela pode ter o mesmo nome de um índice. Além disso cada schema tem seu próprio namespace, ou seja, é possível ter 2 tabelas com o mesmo nome em schemas diferentes.
*Quando uma view materializada é criada, o banco de dados cria uma tabela interna de mesmo nome, essa tabela tem o mesmo namespace que as outras tabela no schema. Então não é possível ter uma tabela e uma view materializada com mesmos nomes.
    Há ainda objetos que não estão dentro de schemas e compartilham o mesmo namespace para todo o banco de dados, esses objetos são os seguintes:
  • Editions
  • Parameter files (PFILEs) and server parameter files (SPFILEs)
  • Profiles
  • Public database links
  • Public synonyms
  • Tablespaces
  • User roles

Regra 9 

    Nomes que não são definidos com uso de aspas duplas, não são sensíveis a maiúsculas e minúsculas, o banco de dados Oracle interpreta todos como se fosse maiúsculos, ou seja, uma tabela que foi definida como nome_tabela será interpretada pelo banco de dados como NOME_TABELA, mesmo que seja escrita em um comando de modo minúsculo ou contendo alguns caracteres maiúsculos e outros minúsculos.
    No caso dos nomes definidos com aspas duplas eles são sensíveis aos caracteres maiúsculos e minúsculos, nesse caso deve ser utilizado exatamente como foi definido.

Regra 10

    Quando o Oracle armazena ou faz comparações do identificadores em letras maiúsculas funciona como se Oracle aplicasse a função UPPER neste identificador.
Esse comportamento de comparação em maiúsculas serve para garantir que as comparações serão corretas independente de quais configurações linguísticas a sessão possui.

Regra 11 - Colunas

    Colunas na mesma tabela não podem ter o mesmo nome, colunas podem ter o mesmo nome em tabelas diferentes. Também é possível utilizar na mesma tabela o mesmo nome de coluna desde que usando aspas duplas na definição.



Regra 12 - Procedures e functions

    Procedures ou functions que estão no mesmo pacote podem ter o mesmo nome caso não tenham a mesma quantidade de argumentos e esses não sejam do mesmo tipo.
O processo de criar vários procedimentos ou funções no mesmo pacote com o mesmo nome e diferentes argumentos é chamado de overloading.

Regra 13 - Tablespaces

    Tablespaces são sensíveis a caracteres maiúsculos e minúsculos, diferente de outros identificadores que também são limitados a 30 bytes.


Fonte:

https://docs.oracle.com/en/database/oracle/oracle-database/21/sqlrf/Database-Objects.html#GUID-1B1818AD-6A70-4C2A-8E86-98BECA723FB8

Nenhum comentário:

Postar um comentário