[oracle_br] shrink space

2015-05-27 Por tôpico aandre...@yahoo.com.br [oracle_br]
Pessoal,
 

 Este comando, faz a compactacao de indices.  Há alguma restricao no uso?
 Mesmo porque se eu compactar o objeto eu libero temporariamente espaco em 
disco, sei que ha o custo do crescimento, mais em caso de emergencia vale apena?
 

 alter index schema.objeto shrink space


[oracle_br] Re: shrink space

2015-05-27 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Opa : então, 
https://richardfoote.wordpress.com/2008/02/08/index-rebuild-vs-coalesce-vs-shrink-space-pigs-3-different-ones/
 e seus links (como 
https://richardfoote.wordpress.com/2008/02/06/differences-and-similarities-between-index-coalesce-and-shrink-space/
 , entre outros) explicam bem, mas de modo geral : 
 

 = a restrição principal é que (óbvio) para evitar que alguém queira 
inserir/deletar/alterar justamente o dado que está sendo movido no momento do 
shrink/compact/whatever, o RDBMS pede por um LOCK EXCLUSIVO, então não pode ter 
Transações abertas no segmento a mover E enquanto o shrink rola quem tentar 
fazer DMLs fica bloqueado
 

 = de modo geral, se vc for aplicar essas opções de movimentação de dados 
(move, rebuild, shrink, etc)  vc *** NÃO *** vai liberar espaço em disco, ok ? 
Pois o tamanho dos datafiles vai ficar o mesmo O que vai acontecer é que 
não só a porção livre da tablespace aumenta MAS também onde possível o espaço 
livre vai pros blocos finais do datafile E os blocos não usados no meio dos 
datafiles serão ocupados, permitindo assim um posterior RESIZE DATAFILE pra um 
tamanho menor - é o RESIZE para um tamanho menor que efetivamente vai liberar o 
espaço em disco de volta para o SO...
 

 Sobre se vale a pena mover, depende : vc deve fazer uma análise de custo x 
benefício, pois Não Só vc pode ter que pagar um Custo em termos de performance 
quando o segmento voltar a crescer MAs também além de eventuais 
indisponibilidades por causa dos locks Também a operação de movimentação em si 
(seja coalesce, shrink, dealocate, move, qual for) é relativamente Custosa, 
principalmente em um segmento grande Realmente vc tem que confrontar a sua 
necessidade versus o esforço envolvido E a condição da emergência - até porque 
normalmente é muito mais eficiente vc alocar mais discos no Storage para 
atender á emergência do que querer fazer análise de ocupação numa situação de 
war room...
 

  []s
 

   Chiappa


[oracle_br] Re: Trigger de Logon.

2015-05-27 Por tôpico jlchia...@yahoo.com.br [oracle_br]
Opa : então, primeiro eu sou ** obrigado ** a te dizer que restringir acesso 
por ferramenta cliente é algo que o RDBMS Oracle absolutamente Não Prevê : o 
fato é que o RDBMS tá pouco se lixando pra qual ferramenta vc usou pra exercer 
seu direito de conexão no database (a preocupação dos desenvolvedores do RDBMS 
Oracle é em comprovar que vc tem direito a acessar o database, com o que vc vai 
acessar não importa pra ele), E além disso numa aplicação moderna tipicamente o 
RDBMS ** nem sequer ENXERGA a máquina do usuário-final (pois ele conecta num 
pool de conexões, e não diretamente ao database)... Ademais, o database NÂO 
CONTROLA quais programas estão solicitando conexão, assim depende TOTALMENTE da 
informação que o programa-cliente dá :  Assim sendo, se vc montar um trigger 
que faça um IF nomedoprogramaconectando = 'SQLPLUS.EXE' , para isso ser burlado 
basta o usuário RENOMEAR o arquivo SQLPLUS.EXE para OUTRACOISA.EXE...  :)
 

  Segundo ponto : normalmente quando a pessoa quer restringir o acesso ao 
database apenas pela Aplicação, isso indica que se o usuário acessar por fora 
há Risco de quebra de integridade/segurança - tipicamente, há alguma regra de 
negócio e/ou alguma Integridade de dados que ao invés de ser mantida DENTRO DO 
DATABASE (caso em que a validação SEMPRE ocorre, independente de qquer coisa) 
neguim criou a tal regra/validação/integridade DENTRO DA APLICAÇÃO, aí se 
acessar o banco fora da aplicação é kaput... Se for esse o seu motivo, pense ** 
seriamente ** em tornar a sua aplicação DATABASE-centric, passando as tais 
regras/validações para dentro do database, que é onde elas Pertencem... Sempre, 
o que se refere a DADOS fica necessariamente DENTRO DO DATABASE...
 

 Mas se ainda assim vc quiser ter um trigger de LOGON que faça isso, veja o 
exemplo em 
https://asktom.oracle.com/pls/apex/f?p=100:11:0P11_QUESTION_ID:561622956788 
...
 

 Agora : imho muito mais Efetivo (se é que essa palavra cabe num 
quebra-galho/gambi do tipo implícito em tasks estranhas como bloquear acesso 
por tool cliente) seria OU vc não dar Acesso às tabelas da Aplicação se a 
pessoa não conectar pela aplicação (digamos, há uma trigger 
WHEN-NEW-FORM-INSTANCE que faz um ALTER SESSION que libera o acesso às tabelas 
ativando uma ROLE, ou popula um context que vai ser exigido numa política de 
FGA que vc criou no database, algo do tipo), OU então vc fazer o controle após 
o fato, ie : ter um job de banco que de minuto em minuto dispara e mata as 
sessões que não setaram algum valor predeterminado via DBMS_APPLICATION_INFO ou 
alguma coisa assim que as tools  clientes não fazem e vc programaria tua 
aplicação para fazer
 

  []s
 

   Chiappa