20060811

Configuració de l'Oracle EPG



Fa anys que Oracle va treure la meravellosa funcionalitat d'accedir als packages de PL/SQL directament des d'un browser, via HTTP va ser quan va inventar el package htp que et permetia generar html dinàmic, això va ser a la versió 7 d'Oracle, quan el servei es deia
WOW (Web Oracle Web) i tot funcionava amb CGIs etc.

Estem parlant de l'any 1996 aproximadament, sinó us en recordeu com pintava la web en aquests anys, mireu aquest enllaç on explica el funcionament del WOW.

El món del desenvolupament web ha donat moltes voltes, però si alguna funcionalitat de la base de dades Oracle va revolucionar la generació de contingut dinàmic via web, aquest va ser el PL/SQL Gateway, també conegut com DAD (Database Access Descriptor) o directament HTP.P (per el package/procedure més utilitzat per escopir contingut al browser)

Recordo les primeres proves que vàrem realitzar a la nostre època de becaris a Oracle, estic parlant del 1996 (Toni, te'n recordes?), la meravellosa demo per vendre un MALL Virtual al Banc de Sabadell, tot directament amb HTML generat des de la Base de Dades (nens, no proveu de fer això a casa !). Evidentment no es va vendre :)

Actualment, com a mínim jo, el PL/SQL Gateway es fa servir per escopir XML d'una manera simple a partir de la informació de la Base de Dades, posteriorment es transformarà aquest XML fent servir un XSLT en un Servlet o en un PHP.

Bé, al que anava, el PL/SQL Gateway ha anat canviant de tecnologia i de nom, tant ràpid com les versions d'Oracle, ha passat de ser un CGI, a córrer sobre el
WAS, el OIAS, el IAS, fins i tot he instal·lat un modul de Apache que feia el mateix que l'oficial d'Oracle però que havia creat un paio pel seu conte.

Finalment, en les ultimes versions (a partir de la 10g), hi ha dues opcions, o t'instal·les a partir del "companion CD" un servidor "tipus apache" amb el seu modul
de plsql integrat (que es el que es venia fent a la versió 9, encara que amb aquesta el webserver ja s'instal·lava sense el companion) o aprofites la nova funcionalitat
del "Embedded PL/SQL Gateway" que corre directament dins la Base de Dades, una historia més propera al Listener d'Oracle de tota la vida que a un Apache.

Per exemple, la nova versió gratuïta de la base de dades Oracle, l'Oracle Express Edition (Oracle XE) ja porta l'EPG integrat i s'instal·la automàticament amb la Base de Dades.

El EPG (Embedded PL/SQL Gateway), per defecte, corre pel port 8080, atenció als usuaris de tomcat, que l'Oracle us ha virlat el port per defecte :)

Doncs això, que ara és més fàcil que mai aprofitar la generació dinàmica de contingut a partir de la Base de Dades Oracle amb PL/SQL,
l'únic problema es com configurar els DAD (Database Access Descriptors) amb aquesta nova versió de Gateway ?

La resposta es, des d'el propi PL/SQL, us poso un exemple de com crear un DAD totalment desprotegit, si-us-plau no pengeu això d'Internet, ja que us poden fer el que vulguin, protegiu
sempre el port 8080 perquè sigui accessible des de màquines internes via firewall, sinó no em faig responsable...

Suposem que tenim un usuari que es diu "ngastos", aquest tros de PL/SQL crearia un DAD que permetria accedir a tots els packages/procedures d'aquest schema (l'script dropeja el dad abans de regenerar-lo).


-- Creation, recreation of a DAD, launch from the user ngastos (the user must have the XDBADMIN role)
begin
begin
dbms_epg.drop_dad('ngastos');
dbms_output.put_line('ngastos dropped');
commit;
exception when others then
dbms_output.put_line('Error: '||sqlerrm);
end;

dbms_epg.create_dad('ngastos', '/ngastos/*');
dbms_epg.set_dad_attribute('ngastos', 'database-username', 'NGASTOS');
dbms_epg.authorize_dad('ngastos');
commit;
end;


Aneu amb conta amb les majúscules, el set_dad_attribute del database-username, necessita tenir el nom d'usuari en majúscules.

A partir d'aquest moment, ja es pot accedir, per exemple a http://localhost:8080/ngastos/hola.html
(Evidentment estic suposant que teniu un package al usuari ngastos que es diu hola, un procedure dintre que es diu html i que esta a la specification i que dintre aquest
teniu un htp.p('hola') per exemple)

La creació d'aquest DAD es totalment compatible (fins que no es demostri el contrari) amb crides a Microcalls que en una aplicació que estem migrant abans es feien contra un Apache amb el mod_plsql d'Oracle 9iR2 i també en el entorn de producció contra un Apache d'Oracle instal.lat a partir del "Companion CD" en una 10gR2, així que ja no hi ha excusa per no fer servir microcalls des d'un EPG :)

També us pot ser útil per debuggar si alguna cosa no us funciona, aquest scriptillo, que mostra tots els atributs de un DAD en concret.


-- Show all the attributes in a DAD
declare
-- Local variables here
i integer;
l_attr_name VARCHAR2(30);
l_attr_value VARCHAR2(30);

PROCEDURE my_get_dad_attribute (p_dad_name IN VARCHAR2,
p_attr_name IN VARCHAR2) AS
l_attr_value VARCHAR2(3000);
BEGIN
l_attr_value := DBMS_EPG.get_dad_attribute (
dad_name => p_dad_name,
attr_name => p_attr_name);

DBMS_OUTPUT.put_line(p_attr_name || '=' || l_attr_value);
END;
BEGIN
DBMS_OUTPUT.put_line('Attributes');
DBMS_OUTPUT.put_line('=========');

my_get_dad_attribute('ngastos', 'after-procedure');
my_get_dad_attribute('ngastos', 'always-describe-procedure');
my_get_dad_attribute('ngastos', 'authentication-mode');
my_get_dad_attribute('ngastos', 'before-procedure');
my_get_dad_attribute('ngastos', 'bind-bucket-lengths');
my_get_dad_attribute('ngastos', 'bind-bucket-widths');
my_get_dad_attribute('ngastos', 'cgi-environment-list');
my_get_dad_attribute('ngastos', 'compatibility-mode');
my_get_dad_attribute('ngastos', 'database-username');
my_get_dad_attribute('ngastos', 'default-page');
my_get_dad_attribute('ngastos', 'document-path');
my_get_dad_attribute('ngastos', 'document-procedure');
my_get_dad_attribute('ngastos', 'document-table-name');
my_get_dad_attribute('ngastos', 'error-style');
my_get_dad_attribute('ngastos', 'exclusion-list');
my_get_dad_attribute('ngastos', 'fetch-buffer-size');
my_get_dad_attribute('ngastos', 'input-filter-enable');
my_get_dad_attribute('ngastos', 'info-logging');
my_get_dad_attribute('ngastos', 'owa-debug-enable');
my_get_dad_attribute('ngastos', 'max-requests-per-session');
my_get_dad_attribute('ngastos', 'nls-language');
my_get_dad_attribute('ngastos', 'path-alias');
my_get_dad_attribute('ngastos', 'path-alias-procedure');
my_get_dad_attribute('ngastos', 'request-validation-function');
my_get_dad_attribute('ngastos', 'session-cookie-name');
my_get_dad_attribute('ngastos', 'session-state-management');
my_get_dad_attribute('ngastos', 'transfer-mode');
my_get_dad_attribute('ngastos', 'upload-as-long-raw');
end;


Més informació sobre el EPG

5 comentarios:

Anónimo dijo...

Joer, quina currada t'has fotut. Aquest post segur que li encanta al Manel, que sempre diu... "Veus? aquests posts si que molen!!"

David Pujol dijo...

Hola, quina por ..., ara un servidor http "embedded" ... Veig que aquest tema encara evoluciona, jo que em pensava que li quedaven quatre dies .., però veig que tu encara li treus suc.

Mira:
http://www.oracle-base.com/articles/10g/dbms_epg_10gR2.php

Anónimo dijo...

Sí que m'enrecordo, i tant! Jo ja li he deixat de treure el suc a aquest invent però té la seva gràcia. En un entorn una miqueta més segur i una arquitectura física més estratificada, això de penjar el Gateway del listener de sqlnet no em fa gaire gràcia. Més per seguretat que per escalabilitat, però són manies meves. I apa, força als microcalls!!!!

Anónimo dijo...

continues sent el crack de sempre.

Jo encara recordo el programa desenvolupat amb el package PHP generat a partir de l'eina de generació automática de codi de Oracle Designer (crec que fa alguns anys d'això) per a publicar dinamicament el procediments creats pels arturitos.

I mira despres d'uns quans anys on em anat a parar .....

Anónimo dijo...

Aquest SI que és un post util, resulta que ja he hagut d'utilitzar l'script dues vegades.
A més quan busques info al Google sobre com solucionar el tema del EPG apareix dels primers!

Ara faré la meva aportació:
Resulta que quan instales el Oracle XE, per defecte qualsevol crida HTTP al EPG reuquereix autentificació d'usuari. Això és un "bajadon" si vols utilitzar MicroCalls (per exemple).

La solució que he trobat passa per donar permis al user ANONYMOUS per utilitzar el DAD que hem creat:

begin
dbms_epg.authorize_dad('ngastos','ANONYMOUS');
commit;
end;

Clarles