.comment-link {margin-left:.6em;}

Tuesday, October 25, 2005

Autenticação Externa

OS authentication ou Externally Authenticate Accounts.

Para conectar-se ao banco sem a necessidade de informar usuário e senha, considere OS authentication. A configuração é bastante simples, vamos demonstrar no Unix e em uma outra oportunidade no Windows.

Ver a configuração do os_authent_prefix


ops$mportes@FCCUAT9I> show parameter os_authent_prefix

NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
os_authent_prefix string OPS$



O default é ops$. Agora basta criar um usuário no oracle com OPS$.
No meu exemplo, tenho o login mportes, portanto criei o usuário ops$mportes.


OPS$MPORTES
^^^^^^^ ---> Usuário do Unix.
^^^^ ----------> Valor do parâmetro os_authent_prefix

[mportes@lath09 /home01/mportes/oracle/sql]$ id
uid=52722(mportes) gid=101(dba) groups=205(support)

[mportes@lath09 /home01/mportes/oracle/sql]$ sqlplus /

SQL*Plus: Release 9.2.0.3.0 - Production on Tue Oct 25 08:52:16 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.


Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production

ops$mportes@FCCUAT9I>




Conectado sem a informar usuário ou senha. Muito prático para uso de script, por exemplo:

[mportes@lath09 /home01/mportes/oracle/bin]$ cat test.sh
#!/usr/bin/ksh

sqlplus -s / <<eof
col var new_value valor

select '$ORACLE_HOME' var from dual;

declare
l_v varchar(90) := '&valor';
begin
dbms_output.put_line( 'A variavel de ambiente :' l_v );
end;
/

eof



[mportes@lath09 /home01/mportes/oracle/bin]$ ./test.sh

VAR
------------------------------
/FlexUAT/oracle/app/product/9i

1 row selected.

A variavel de ambiente :/FlexUAT/oracle/app/product/9i

PL/SQL procedure successfully completed.


Tuesday, October 18, 2005

DBMS_SCHEDULER executando .BAT

Com a versão 10g é possível executar arquivos de lote no Windows (.BAT) através do Oracle. Especificamente através da nova package DBMS_SCHEDULER. É muito importante a leitura e entendimento desta package para seu uso.

No exemplo abaixo, precisei recorrer ao metalink para conseguir a execução. O que acontece é que o arquivo .bat nada mais é que um arquivo texto não executável (talvez a Oracle tenha negligenciado isso, porque .bat é realmente executável - pelo menos para o mundo Windows). Para contornar esse desvio, usaremos a ajuda do c:\windows\system32\cmd.exe. O número do "bug" no metalink é 3824718.

O Exemplo é simples. Basicamente dois arquivos .bat - O primeiro teste.bat tem o que queremos executar como tarefa e o test2.bat vai disparar o primeiro. No Unix não há essa bagunça. Por que? Ora, basta um chmod a+x ./nome_arquivo e pronto qualquer usuário pode executar o nome_arquivo, porque ele realmente tornou-se um executável, essa facilidade não existe no mundo Windows.

Os arquivos lote.

ops$marcio@WIN10GR2> host type teste.bat
copy e:\temp\teste.bat e:\temp\teste_funcionou > nul

ops$marcio@WIN10GR2> host type test2.bat
c:\windows\system32\cmd.exe /c e:\temp\teste.bat > e:\temp\command.output


Vamos entender o que o teste.bat vai fazer. Copiar ele mesmo para outro arquivo chamado teste_funcionou no diretório e:\temp - isso vai mostrar que o .bat realmente funcionou. Note que estamos enviando a saída do comando copy ("1 file(s) copied.") para nul (NUL com um 'L' só porque isso aqui é Windows).

O test2.bat é usado como gatilho, apenas dispara o teste.bat e guarda a saída em command.output.

Agora, rodando o exemplo:

ops$marcio@WIN10GR2> host dir
Volume in drive E is New Volume
Volume Serial Number is 0C49-8771

Directory of E:\temp

10/19/2005 12:07 AM <DIR> .
10/19/2005 12:07 AM <DIR> ..
10/18/2005 11:39 PM 598 schedemo.sql
10/18/2005 10:36 PM 2,197 t.sql
10/18/2005 11:34 PM 76 test2.bat
10/18/2005 11:38 PM 54 teste.bat
4 File(s) 2,925 bytes
2 Dir(s) 56,558,862,336 bytes free

Nada do commando.output nem do teste_funcionou, lembre-se de que a criação desses arquivos mostra o sucesso da execução.

ops$marcio@WIN10GR2> begin
2 dbms_scheduler.create_job (
3 job_name => 'teste_scheduler',
4 job_action => 'C:\WINDOWS\SYSTEM32\CMD.EXE',
5 number_of_arguments => 3,
6 job_type => 'executable',
7 enabled => false
8 );
9
10 dbms_scheduler.set_job_argument_value('teste_scheduler',1,'/q');
11 dbms_scheduler.set_job_argument_value('teste_scheduler',2,'/c');
12 dbms_scheduler.set_job_argument_value('teste_scheduler',3,'e:\temp\test2.bat');
13
14 dbms_scheduler.enable('teste_scheduler');
15 end;
16 /

PL/SQL procedure successfully completed.

ops$marcio@WIN10GR2>
ops$marcio@WIN10GR2> set echo off
ops$marcio@WIN10GR2> host dir
Volume in drive E is New Volume
Volume Serial Number is 0C49-8771

Directory of E:\temp

10/19/2005 12:12 AM <DIR> .
10/19/2005 12:12 AM <DIR> ..
10/19/2005 12:12 AM 78 command.output
10/18/2005 11:39 PM 598 schedemo.sql
10/18/2005 10:36 PM 2,197 t.sql
10/18/2005 11:34 PM 76 test2.bat
10/18/2005 11:38 PM 54 teste.bat
10/18/2005 11:38 PM 54 teste_funcionou
6 File(s) 3,057 bytes
2 Dir(s) 56,558,862,336 bytes free

ops$marcio@WIN10GR2>

Como se pode notar acima, a execução do .bat aconteceu corretamente.

Adendo #1 - 26/Out/2005.
Estou desenvolvendo um pequeno sistema de administração de orçamentos domésticos e pretendo fazer o deploy tanto em Linux quanto Windows e tive que usar a dica acima, digamos, "em produção" quero dizer - minha produção. E o que eu melhorei da dica acima foi o .bat de disparo. Eu fiz um só bat que dispara qualquer outro através de parâmetro %1 e adicionei um argumento a mais na chamada da dbms_scheduler.

This page is powered by Blogger. Isn't yours?