quarta-feira, 15 de fevereiro de 2017

ORA-01775: loop na cadeia de sinônimos


O erro  ORA-01775: loop na cadeia de sinônimos , ocorreu para mim após a execução de um script SQL que continha o comando abaixo:  

                  CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "DUAL";

Após a execução do comando acima todas as triggers do banco de dados que utilizam a tabela “DUAL” para auxiliar no comando sql que retorna o valor de incremento da “Sequence” pararam de funcionar. 

Abaixo o comando sql que utilizo nas minhas triggers para obter o valor sequencial.  


       Select Nome_da_Sequence.nextval into :new.ID   From dual;   

             
                  Observação: A tabela Dual é muito utilizada para fazer operações com select                                             aonde não é necessário fazer extração de dados em tabelas.                                                 Basicamente ela ajuda a manter a sintaxe correta de um select                                               aonde não teremos uma tabela na consulta.

Esse comando alterou o valor do campo “TABLE_OWNER” da tabela “DBA_SYNONYMS” que antes apresentava o nome do usuário “SYS”  para o nome do usuário “THIAGO_OWNER”, essa mudança fez com que os usuários que utilizavam a tabela "DUAL" perdessem a permissão para utiliza-la.


Utilize o comando SQL abaixo para visualizar o registro da tabela “DUAL” na tabela “DBA_SYNONYMS”.



  SELECT * FROM dba_synonyms WHERE owner = 'PUBLIC' AND synonym_name = 'DUAL';

Resultado:


OWNER
SYSNONYM_NAME
TABLE_OWNER
TABLE_NAME
DB_LINK
PUBLIC
DUAL
SYS
THIAGO_OWNER
(null)


Para efetuar a correção execute o comando abaixo: 

          CREATE OR REPLACE PUBLIC SYNONYM "DUAL" FOR "SYS"."DUAL";

Agora execute novamente o comando abaixo e você verá que o valor do campo “TABLE_OWNER” estará como o nome do usuário "SYS".

SELECT * FROM dba_synonyms WHERE owner = 'PUBLIC' AND synonym_name = 'DUAL';

Resultado:

OWNER
SYSNONYM_NAME
TABLE_OWNER
TABLE_NAME
DB_LINK
PUBLIC
DUAL
SYS
DUAL
(null)

Bom pessoal e isso ai, espero ter ajudado! Até aproxima.

Autor: Thiago Pereira


quinta-feira, 27 de junho de 2013

Agendador de tarefas CRON


Descrição:
 
O Cron, e o gerenciador de tarefas do sistema operacional Linux. Ele e responsável pelo  agendamento de tarefas e sua execução.
 
Imagine que você precisa fazer um backup do banco de dados, mais você não que fazer no horário de expediente da empresa e neste momento que o Crontab entra em cena para nos auxiliar. Você irá fazer um script de backup e depois criar um agendamento de tarefa. 
Que pode ser configurando para executar em momentos de tempo específicos em: minuto, hora, dia do mês, mês, dia da semana.

Atributos do comando crontab:


Atributo Descrição
crontab -l Visualiza os agendamento de todos os usuário.
crontab -lu username Visualiza os agendamentos de um usuário especifico.
Obs: Só o usuário [root] tem permissão para usar o
 atributo "u"junto com o atributo "l". 
crontab -r Deleta todos os agendamentos do usuário corrente.
crontab -ru Deleta todos os agendamentos de um usuário especifico.
Obs: Só o usuário [root] tem permissão para usar o
atributo "u" junto com o atributo "r". 
crontab -e Edita o arquivo de agendamento do crontab.
O editor de texto e o "vi" onde para inser o texto e
necessário pressionar a tecla [i] que habilita entrada de texto.
Para salvar pressione a tecla [Esc] para sair do modo
edição e depois a tecla [:], para entra no prompt de opção
do editor, depois ente com a opção [wq!] que efetivarar
as alterações. 
crontab -eu username Edita o arquivo de agendamento do crontab de um
usuário especifico.
O editor de texto e o "vi" onde para inser o texto e
necessário pressionar a tecla [i] que habilita entrada de texto.
Para salvar pressione a tecla [Esc] para sair do modo
edição e depois a tecla [:], para entra no prompt de opção
do editor, depois ente com a opção [wq!] que efetivarar
as alterações. 
crontab -i Confirma antes de deletar os agendamentos do usuário.
  

Local dos Arquivo do Crontab:
Nome Arquivo Descrição
\var\spool\cron Nesse diretório esta os arquivos (crontab) com a configuração de agendamento do usuário. Quando o comando "crontab -e" e  executado, ele abre o  arquivo do usuário atual que esta localizado no diretório "cron" para  edição do usuário que pode inserir um novo agendamento ou apagar um agendamento antigo.

Os arquivos (crontab) localizado no diretório "cron" estão nomeados com o nome dos usuários do Sistema Operacional.

Observação:

O CRON lê os arquivos crontab armazenados nesse diretório referido a cada minuto para verificar as tarefas agendadas nestes arquivos.

O diretório "cron" e os arquivos contidos nele só pode ser acessado através do usuário "ROOT".

Não edite os arquivos (crontab) sem usar o comando "crontab -e" para que eles não fiquem corrompidos.   


Como configurar:

A tabela abaixo mostra os valores a ser inseridos para a configurar da tarefa. A ordem das colunas da tabela estão respeitando a ordem da sequencia a ser informada na tabela de agendamento partindo da esquerda para a direita. 

Minuto Hora Dia Mês Dia Semana Comando
(0-59) (0-23) (1-31) (1-12) (0-6) Comando a ser executado.
 
Observação:

O "Dia Semana" e referenciado da seguinte forma :

0 = Domingo         1 = Segunda-Feira;
2 = Terça-Feira    3 = Quarta-Feira;
4 = Quinta-Feira  5 = Sexta-Feira
6 = Sábado

Observação, nos campos numéricos, é possível a utilização dos seguintes wildcards:

Caracter Especial Descrição
              *  Usado para especificar que o campo deve ser ignorado.

Obs.: Ele perde essa função quando usamos ele com a barra
invertida para especificar um período.

Ex: No campo minuto informamos o seguinte valor "*/5", isso
que dizer que há cada 5 min a tarefa irá ser executada.
              - Usado para especificar range de valores.
              , Usado para especificar valores.
              / Usado para especificar intervalo
 
Sintaxe:

[minutos] [horas] [dias do mês] [mês] [dias da semana] [comando]


Exemplo Simples:
 
Explicação do comando abaixo:

Alinha de agendamento a cima significa para o Cron que você quer executar uma tarefa às 15:30 no dia 27 do mês de Junho na Quinta-Feira, para executar o comando "ls" que vai listar todo o conteúdo do diretório /home/thiago e depois irá criar um arquivo com o conteúdo da listagem com o nome "listaArq.txt". 
 
MinutoHoraDiaMêsDia SemanaComando
  30
 15
 27
 6
 4
 ls -l /home/soa > /home/Thiago/listaArq.txt

                                                           
Exemplo Avançado:


Explicação do comando abaixo:

Isto executaria o “comando” as 8:00 do dia 10/Junho em qualquer dia da semana (observe que ignoramos o dia da semana).
 
MinutoHoraDiaMêsDia SemanaComando
  0
 8
 10
 6
*
 

Explicação do comando abaixo: 

Isto executaria o “comando” as 8:00 do domingo (não importa qual seja o dia do mês e nem qual seja o mês, o valor 0 no quinto campo indica o domingo).
 
MinutoHoraDiaMêsDia SemanaComando
  0
 8
 *
 *
0
 

Explicação do comando abaixo:

Isto executaria o “comando” as 8:00 do dia 10 (não importa o mês e nem o dia da semana).
 
MinutoHoraDiaMêsDia SemanaComando
  0
 8
 *
 *
0
 



Explicação do comando abaixo:

Isto executaria o “comando” as 8:00 do dia 10 (não importa o mês e nem o dia da semana).
 
MinutoHoraDiaMêsDia SemanaComando
  0
 8
 10
 *
*
 

Explicação do comando abaixo:

Isto executaria o “comando” as 8:00 (todos os dias de todos os meses em qualquer dia da semana).
 
MinutoHoraDiaMêsDia SemanaComando
  0
 8
 *
 *
*
 


Explicação do comando abaixo:

Isto executaria o “comando” a cada 5 minutos (todos hora de cada dia do mês de todos os meses em qualquer dia da semana).
 
MinutoHoraDiaMêsDia SemanaComando
  5
 *
 *
 *
*
 


Explicação do comando abaixo:

Isto executaria o “comando” todos os minutos, ou seja, a cada minuto de cada hora em todos os dias do mês e da semana todos os meses.
 
MinutoHoraDiaMêsDia SemanaComando
  *
 *
 *
 *
*
 

Exemplo Avançado com Caracteres Especial:

Explicação do comando abaixo:

'-' para especificar range de valores

Se aplicado no campo de minuto, significaria do minuto 1 ao 7.
 
MinutoHoraDiaMêsDia SemanaComando
1-7  
 *
 *
 *
*
 


Explicação do comando abaixo:

',' para especificar valores

Se usado no campo de hora, significara nas horas 1, 2 e 4.
 
MinutoHoraDiaMêsDia SemanaComando
0  
 1,2,4
 *
 *
*
 

Explicação do comando abaixo:

'*/n' para especificar intervalo

Se usado no campo de minuto, significaria que a cada 5 minutos.
 
MinutoHoraDiaMêsDia SemanaComando
*/5  
 *
 *
 *
*
 

Bom pessoal e isso ai, espero ter ajudado! Até aproxima.

Autor: Thiago Pereira


Referências:

http://blog.welrbraga.eti.br/?p=1379

 

sexta-feira, 21 de junho de 2013

Como instalar Oracle Instant Client no Windows

A grande pergunta é como fazer uma conexão remota com o banco de dados Oracle? Sendo que eu instalei meu banco de dados Oracle em uma maquina e a instalação do banco de dados instalou o SQLPLUS nessa maquina, isso que dizer que todas as vezes que eu quiser manipular o banco de dados terei de entra na maquina onde esta a instalação do banco para interagir com ele? A resposta e não a Oracle fez um pacote mais resumido de seu binários onde tem o SQLPLUS para que você possa realizar acesso ao banco de dados de forma remota, não tendo a necessidade de realizar a interação do banco de dados de forma local. 

 1º Passo

 Vamos até o site da Oracle para fazer download do “Instant Client”; Url: http://www.oracle.com/index.html Vá na opção “DOWNLOADS”, depois ira aparecer uma pagina com todos os produtos da Oracle veja a área “Database” nessa área terá a opção (Instant Client) clique nela. Para o sistema operacional Windows irá aparecer as sequintes opções:

Instant Client for Microsoft Windows (32-bit)
Instant Client for Microsoft Windows 64-bit Itanium
Instant Client for Microsoft Windows (x64)

Depois que você escolheu ira aparecer outra tela com as opções de pacotes, observação eles estão compactados e não são auto instaláveis. Escolha a opção:

*Instant Client Package - SQL*Plus: Additional libraries and executable for running SQL*Plus with Instant Client
instantclient-sqlplus-windows.x64-11.2.0.3.0.zip (822,980 bytes)

2º Passo

Agora vamos descompactar o arquivo “instantclient-sqlplus-windows.x64-11.2.0.3.0.zip” onde esta o executável do SQLPLUS. Dentro do arquivo compactado terá uma pasta com o nome “instantclient_11_2” copie essa pasta para onde você achar melhor. No meu caso vou colocar no “C:\”, que ira ficar com a seguinte representação do caminho “C:\ instantclient_11_2”, estou frisando o caminho do arquivo pois iremos precisar dessa informação para apontar para a variável de ambiente.

3º Passo

Configuração das variáveis de ambiente no sistema operacional. Vá até o Painel de Controle clique na opção “Sistema” nas propriedades de Sistema clique na opção [Variáveis de Ambiente].

Na área “Variáveis do sistema” procure pela variável “Path”, agora vamos clicar na opção “Editar” ira aparecer a tela para você inserir o caminho onde esta a pasta com o executável do SQLPLUS.


Colocar o caminho da pasta onde esta o executavel SQLPLUS se faz necessario para que o “MS-DOS” reconheça o comando [SQLPLUS]. Agora temos que configurar outra variavel de ambiente com o nome “TNS_ADMIN”, diferente da variavel “Path” que já estava criada no sistema operacional. Agora vamos criar um nova variavel de ambiente clique na opção [Novo...] que se localiza na tela “Variaveis de Ambiente”, ira parecer uma tela para voce entra com o nome da variavel e o valor. Observação: Na tela de “Variaveis de Ambiente” existe duas areas de variaveis de ambiente que são:

Variáveis de usuário:

Isso que dizer que a variável criada nessa área só ira existir para o usuário especifico no caso o usuário logado que esta efetuando essa operação no meu caso e o usuário “thiago”

Variáveis de Sistema:

Todas as variáveis que estão aqui reflete para todos os usuários que logarem no sistema. Resumindo e o que chamamos de variável compartilhada para todos do sistema operacional.

Agora insira a sequintes dados: Nome: [TNS_ADMIN], Valor: [C:\instantclient_11_2]


Você deve esta se perguntando para que criar a variavel [TNS_ADMIN]? Vou lhe responder agora! O SQLPLUS precisa de um arquivo chamado de “tnsnames.ora” onde comtem a descrição dos parametros de conexão com o banco de dados Oralce.

Conteudo do arquivo tnsnames.ora:
<addressname> =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(Host = <hostname>)(Port =  <port>))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = <sid>)
 )
)

O TNS (Substrato Transparente de Rede) é uma camada de comunicação usada pelos bancos de dados Oracle. O nome de serviço do TNS é o nome pelo qual uma instância do banco de dados Oracle é identificada em uma rede. Você atribui um nome de serviço ao TNS quando for configurar a conectividade do banco de dados Oracle. A replicação usa o nome de serviço do TNS para identificar o Assinante e estabelecer conexões.

addressname
E o nome que você vai dar para a conexão que você esta configurando no arquivo “tnsnames.ora”. Esse nome vai ser referenciado quando você for executar o seguinte comando: SQLPLUS <Nome_Usuario>/<Senha_Usuario>@<addressname>
ADDRESS

(PROTOCOL = TCP)
Tipo de protocolo de comunicação que esta sendo usado em sua rede.
(Host = <hostname>)
Na opção Host podemos colocar dois tipo de valor o nome “NetBios” do servidor ou o endereço IP. Eu aconselho colocar o endereço IP.
(Port =  <port>)
Na opção Port, e o numero da porta de comunicação conhecida como Socket. Todo serviço disponível na rede esta para um <IP> + <Socket>, o banco de dados oracle não foge a regra, uma instancia de Bando de dados esta para uma porta de comunicação, uma porta padrão da oracle e a 1521.


SERVICE_NAME
Esse atributo e usado para referenciar o Service Name do listener criado no servidor para ouvir as requisições do banco.

O meu arquivo vai ficar com a seguinte configuração:

Conteudo do arquivo tnsnames.ora:
XE =
 (DESCRIPTION =
   (ADDRESS_LIST =
     (ADDRESS = (PROTOCOL = TCP)(Host = 192.168.0.57)(Port = 1521))
   )
 (CONNECT_DATA =
   (SERVICE_NAME = xe)
 )
)

Salve o arquivo no caminho que você configurou na variavel de ambiente [TNS_ADMIN].

4º Passo

Vamos testar para ver se deu tudo certo em nossa configuração chame o pronpt de comando DOS, nele digite o seguinte comando:

teste_owner/123456@EX

Resultado:
C:\>Sqlplus teste_owner/123456@XE

SQL*Plus: Release 11.2.0.3.0 Production on Fri Jun 21 17:51:08 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

SQL>

Bom pessoal e isso ai, espero ter ajudado! Até aproxima.

Autor: Thiago Pereira

Descobrir as tabelas que fazem parte do banco de dados ORACLE

Vamos conectar ao banco de dados através do “sqlplus”, para interagir com o banco de dados.
Obs.: O programa SQLPLUS e um Client Oracle para permitir que o DBA Oracle interaja com o banco de dados de forma (Local ou Remota).

c:\>sqlplus system/123456@XE

SQL*Plus: Release 11.2.0.3.0 Production on Fri Jun 21 10:46:55 2013

Copyright (c) 1982, 2011, Oracle.  All rights reserved.


Connected to:
Oracle Database 11g Express Edition Release 11.2.0.2.0 - Production

SQL>

Depois de conectado ao banco de dados través do sqlplus vamos executar comando “SELECT”.
No exemplo abaixo vou executar o comando Select retornando os dados contidos na coluna “TABLE_NAME” que se encontra na tabela “ALL_ALL_TABLES” realizando o filtro através do campo “OWNER”. No meu caso eu tenho um usuário chamado “TESTE_OWNER”,  vou listar todas as tabelas criadas pelo usuário no banco de dados.

Antes de tudo execute o comando Set com os atributos linesize e pagesize:

linesize
Define o número de caracteres que o SQL*Plus apresenta numa linha.
pagesize
Define o número de linhas de texto que formam uma página.

Comando:
SQL> set linesize 350 pagesize 999;

Executando o comando abaixo vamos visualizar o nome do dono da tabela, nome da tabela que o usuário criou e o tablespace onde esta localizada a tabela.

Comando:
SQL>SELECT owner,table_name, tablespace_name FROM all_all_tables WHERE OWNER='TESTE_OWNER';

Resultado:

OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
TESTE_OWNER                    CADCLIENTE                     USERS

Observação: se você não usar o where com o campo owner o select irá retornar todas as tabelas criadas no banco de dados.

Comando:
SQL>SELECT owner,table_name, tablespace_name FROM all_all_tables;

Resultado:

OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
SYSTEM                         LOGMNR_SESSION_ACTIONS$        SYSAUX
SYSTEM                         LOGMNR_PROCESSED_LOG$          SYSAUX
SYSTEM                         LOGMNR_FILTER$                 SYSAUX
CTXSYS                          DR$DBO
SYS                                 UTL_RECOMP_COMPILED            SYSTEM
SYSTEM                         LOGMNR_AGE_SPILL$              SYSAUX
SYS                                 UTL_RECOMP_SORTED              SYSTEM
SYSTEM                         LOGMNR_INTEGRATED_SPILL$       SYSAUX
SYSTEM                         LOGMNR_SPILL$                  SYSAUX
SYSTEM                         LOGMNR_UID$                    SYSAUX
SYSTEM                         LOGMNR_LOG$                    SYSAUX
SYSTEM                         LOGMNR_RESTART_CKPT_TXINFO$    SYSAUX
SYSTEM                         LOGMNR_GLOBAL$                 SYSAUX
SYSTEM                         LOGMNR_ERROR$                  SYSAUX
SYSTEM                         LOGMNRC_DBNAME_UID_MAP         SYSAUX
SYSTEM                         LOGMNR_RESTART_CKPT$           SYSAUX
SYSTEM                         LOGMNR_SESSION_EVOLVE$         SYSAUX
SYS                                 KOTTD$                         SYSTEM
SYS                                 KOTTB$                         SYSTEM
SYS                                 KOTAD$                         SYSTEM
SYS                                 KOTMD$                         SYSTEM
SYS                                 KOTTBX$                        SYSTEM

Bom pessoal e isso ai, espero ter ajudado! Até aproxima.
Autor: Thiago Pereira