Coluna com Auto Incremento

agosto 25th, 2010 por Marcos Aurelio Braga

Visitando o forum hoje, vi uma pergunta que sempre aparece, que são as dúvidas de muitos iniciantes no mundo Oracle que trabalham com outros bancos de dados sobre os campos auto incrementais. Até o momento a Oracle não disponibiliza uma solução como outros bancos de dados, mas é possível criar uma solução.

Como já havia dado uma dica para um amigo a respeito desse assunto, resolvi guardá-lo.

A solução encontrada é a utilização de uma sequence e uma trigger que vai fazer o trabalho de incrementar o campo.

Procedimento para criar um campo auto incremental.

1. Criar uma tabela

SQL> create table t1 (cod number primary key, text varchar2(50));

Tabela criada.

2. Criar uma sequence

SQL> create sequence sq_t1cod start with 1 increment by 1;

Sequencia criada.

3. Criar uma trigger que usa a sequence

SQL> create trigger tg_t1cod
2 before insert on t1
3 for each row
4 begin
5 select sq_t1cod.nextval into :new.cod from dual;
6 end;
7 /

Gatilho criado.

4. Testar

SQL> insert into t1 (text) values ('primeiro registro');

1 linha criada.

SQL> insert into t1 (text) values ('segundo registro');

1 linha criada.

SQL> commit;

Commit concluido.

SQL> select * from t1;

COD TEXT
---------- -----------------------
1 primeiro registro
2 segundo registro

2 linhas selecionadas.


Marcos Aurélio Braga
OCA - Oracle Database 10g Administrator

Trigger de Logon que Limita por Tempo

agosto 13th, 2010 por Marcos Aurelio Braga

Essa trigger foi criada da necessidade de limitar um determinado usuário de conectar em determinada faixa de horário.

create or replace trigger TRG_LOGON_LIMIT_TIME
after logon on database
begin
if (USER = 'USUARIO_CONEXAO_DO_SISTEMA' and (to_char(sysdate, 'hh24:mi') '18:00')) then
RAISE_APPLICATION_ERROR(-20011, '---> Desculpe, acesso ao banco somente das 08:00 as 18:00 <---');
end if;
end;
/

Nesse exemplo, foi limitado o acesso entre 08:00 as 18:00h para o usuário USUARIO_CONEXAO_DO_SISTEMA.

Através desse exemplo é possível adaptar para a realidade de cada ambiente.


Marcos Aurélio Braga
OCA - Oracle Database 10g Administrator

Recriar Tablespace Temporária

junho 29th, 2010 por Marcos Aurelio Braga

A tablespace temporária (temporary tablespace) é utilizada para armazenar dados de ordenação ou dados de tabelas temporárias. Essa tablespace tem seu espaço físico reservado por um datafile temporário (temporary datafile ou tempfile).

Os tempfiles são consultados utilizando as views V$TEMPFILE e DBA_TEMP_FILES.

A tablespace temporária não é crítica, seu backup não é possível através das ferramentas do banco de dados (RMAN, export, datapump ou begin backup) e a instância continua ativa quando um problema ocorre com o mesmo; portanto, dependendo da utilização do banco de dados, um problema com o tempfile pode demorar para ser notado pelo DBA.

Os erros reportados por falta de um datafile temporário é sinalizado com um ORA-01116, seguindo de um ORA-01110 e ORA-27041.

Este post simula a remoção de um tempfile (através do sistema operacional) e uma alternativa para solução do problema utilizando exemplos práticos e as mensagens reportadas no alert log.

Conhecendo os tempfiles existentes

Utilizando a V$TEMPFILE:

SQL> select name from v$tempfile;

NAME
----------------------------------
/oracle/oradata/orcl/temp01.dbf

Utilizando a DBA_TEMP_FILES:

SQL> select tablespace_name, file_name from dba_temp_files;

TABLESPACE_NAME FILE_NAME
---------------- ------------------------------------
TEMP /oracle/oradata/orcl/temp01.dbf

Teste de backup de uma tablespace temporária

Utilizando SqlPlus:

SQL> alter tablespace temp begin backup;

alter tablespace temp begin backup
*

ERRO na linha 1:
ORA-03217: opção inválida para alteração de TEMPORARY TABLESPACE

Alert Log…

Tue Jun 15 11:09:47 2010
alter tablespace temp begin backup
ORA-3217 signalled during: alter tablespace temp begin backup...

Utilizando RMAN

RMAN> backup tablespace temp;

Iniciando backup em 25/06/2010 17:39:24

utilizando o canal ORA_DISK_1

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: falha do comando backup em 06/25/2010 17:39:24
RMAN-20202: Tablespace não encontrado no catálogo de recuperação
RMAN-06019: não foi possível traduzir nome do tablespace "TEMP"

Como demonstrado, não há como efetuar backup de uma tablespace temporária utilizando as ferramentas do oracle, pelo fato de não ser uma tablespace crítica.

Excluindo um datafile temporário

Na prática ninguém exclui um arquivo do banco de dados, mas devemos nos preparar para todo tipo de situação. Iremos excluir um datafile temporário para observar o que ocorre com o banco e como solucionar o problema.

Excluindo o datafile:

[oracle@vmoracle ~]$ rm -fv /oracle/oradata/orcl/temp01.dbf
removed `/oracle/oradata/orcl/temp01.dbf’

Após a exclusão do datafile a instância continua no ar, sem causar problemas imediatos para o usuário.

Simulando um erro:

SQL> select a.owner, a.object_type, a.object_name from all_objects a
2 where exists (select 1 from all_objects b
3 where a.owner = b.owner
4 and a.object_type = b.object_type)
5 order by owner, object_type, object_name;
select a.owner, a.object_type, a.object_name from all_objects a where exists (select 1 from all_objects b where a.owner = b.owner and a.object_type = b.object_type) order by owner, object_type, object_name
*

ERRO na linha 1:
ORA-01116: erro ao abrir o arquivo 201 do banco de dados
ORA-01110: 201 do arquivo de dados: '/oracle/oradata/orcl/temp01.dbf'
ORA-27041: não é possível abrir arquivo
Linux Error: 2: No such file or directory
Additional information: 3

Esta consulta força a utilização de segmento temporário; como este segmento foi excluído, o erro é retornado.

Solucionando o problema

Como a instância não caiu, o problema é solucionado com o banco ativo, acompanhando os seguintes procedimentos.

1. Criar outra tablespace temporária:

SQL> create temporary tablespace newtemp tempfile '/oracle/oradata/orcl/newtemp.dbf' size 10m;

Tablespace criado.

Alert Log…

Tue Jun 15 10:51:02 2010
create temporary tablespace newtemp tempfile '/oracle/oradata/orcl/newtemp.dbf' size 10m
Completed: create temporary tablespace newtemp tempfile '/oracle/oradata/orcl/newtemp.dbf' size 10m

2. Alterar a tablespace temporária padrão do banco de dados:

SQL> alter database default temporary tablespace newtemp;

Banco de dados alterado.

Alert Log…

Tue Jun 15 10:52:26 2010
alter database default temporary tablespace newtemp
Completed: alter database default temporary tablespace newtemp

3. Eliminar a tablespace antiga:

SQL> drop tablespace temp including contents and datafiles;

Tablespace eliminado.

Alert Log…

Tue Jun 15 10:54:17 2010
drop tablespace temp including contents and datafiles
Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2201.trc:
ORA-01122: o arquivo 201 do banco de dados falhou na análise da verificação
ORA-01110: 201 do arquivo de dados: '/oracle/oradata/orcl/temp01.dbf'
ORA-01565: erro ao identificar o arquivo '/oracle/oradata/orcl/temp01.dbf'
ORA-27037: não é possível obter status do arquivo
Linux Error: 2: No such file or directory
Additional information: 3
Errors in file /oracle/diag/rdbms/orcl/orcl/trace/orcl_ora_2201.trc:
ORA-01258: não foi possível deletar o arquivo temporário /oracle/oradata/orcl/temp01.dbf
Completed: drop tablespace temp including contents and datafiles

Quando a tablespace é eliminada, no SqlPlus não é retornado erro, porém, observando o alert log o erro de que o datafile não existe é reportado.

4. Alterar o nome da nova tablespace para o nome antigo:

SQL> alter tablespace newtemp rename to temp;

Tablespace alterado.

Alert Log…

Tue Jun 15 10:55:30 2010
alter tablespace newtemp rename to temp
Tablespace 'NEWTEMP' is renamed to 'TEMP'.
Completed: alter tablespace newtemp rename to temp

Esse procedimento evita problemas com qualquer script externo que utilizem o nome da tablespace temporária.

Solução aplicada, os erros param de ocorrer.


Marcos Aurelio Braga
Oracle Certified Administrator 10g

Oracle Regexp 11.2

abril 15th, 2010 por Marcos Aurelio Braga

Algumas palavras sobre Regexp utilizando Oracle para quem está procurando.

Universo do Braga

[]s
Braga

Oracle 11 release 2 (32 e 64bits) para Windows

abril 6th, 2010 por Marcos Aurelio Braga

Notícia fresca…

Universo do Braga

[]s
Braga

OCA Finalmente

abril 3rd, 2010 por Marcos Aurelio Braga

Agradecimento pela primeira conquista ao mundo oracle.

Universo do Braga

[]s
Braga

Movendo AUD$ para fora da tablespace System

fevereiro 3rd, 2010 por Marcos Aurelio Braga

Mais um assunto interessante para quem está iniciando com os processos de auditoria no banco de dados.

http://sites.google.com/site/universodobraga/oracle/movendo-aud-para-fora-da-tablespace-system

[]s
Braga

Data Guard Broker 11g com RMAN (Standby 11g com RMAN)

janeiro 4th, 2010 por Marcos Aurelio Braga

Oi Pessoal,

Primeiro assunto do ano novo…

No fim do ano andei efetuando testes com RMAN e BROKER sobre as novas funcionalidades para criação de um Standby na versão 11g e achei importante postar esses testes.

O artigo ainda não está finalizado, mas está bem adiantado e podemos nos beneficiar com ele.

http://sites.google.com/site/universodobraga/oracle/standby-11g

[]s
Braga

Recover Completo com RMAN

dezembro 10th, 2009 por Marcos Aurelio Braga

Este é um exemplo prático de uma recuperação completa de um banco de dados pequeno utilizando RMAN com Oracle 11g.

http://sites.google.com/site/universodobraga/oracle/recover-completo-oracle-11g

Virtual Columns

novembro 10th, 2009 por Marcos Aurelio Braga

Oi Pessoal,

Criei uma página direcionada aos meus interesses pessoais e profissionais.

Ela engloba um pouco da minha experiência, interesses e o que pretendo compartilhar com a comunidade.

Meu primeiro assunto é sobre Virtual Columns (colunas virtuais) que encontrei na versão 11g.

http://sites.google.com/site/universodobraga/oracle/memoria-viva/oracle11g-virtualcolumns

[]s
Braga