Sei sulla pagina 1di 5

Ejecutar sentencias SQL directamente desde nuestro conector JDBC.

An que el conector JDBC se encarga de realizar todas las operaciones sobre la base de datos, en algunos casos particulares nos puede interesar el hecho de ejecutar sentencias SQL desde las reglas directamente a la base de datos. Hay que tener en cuenta que estamos atacando directamente la base de datos y no pasamos por la poltica de Schemma Mapping, por lo que deberemos hacer referencia a los objetos y atributos tal y como estn en la base de datos, de hecho el conector cuando ve la sentencia , no sigue ejecutando polticas y procede a ejecutar la sentencia SQL. Existen dos tipos de sentencias SQL; Sentencias de ejecucin, de las que slo nos tenemos que preocupar de ejecutar,como es el caso de un update.O las sentencias de consulta, que nos devuelven un resultado, en este caso deberemos capturar el resultado y recorrer los valores segun nos convenga, como seria el caso de una sentencia select. Sentencias de ejecucin Empecemos pues por el primer caso,por seguir un ejemplo,imagina que deseamos hacer una regla dentro de nuestro conector,que refleje en una tabla de eventos de la base de datos, cada modificacin de un campo en Meta. Con el fin de mantener este histrico, insertaremos un registro con el valor antiguo , el nuevo y el identificador de usuario cada vez que se propague un cambio de atributo desde el metadirectorio. El codigo XML que necesitamos generar para ejecutar la sentencia es el siguiente : <jdbc:statement event-id=1 jdbc:type=insert xmlns:jdbc=urn:dirxml:jdbc> <jdbc:sql>insert into eventlog(newvalue,oldvalue,id) values(Jose,'Manuel,4)</jdbc:sql> </jdbc:statement> Encontramos un nodo jdbc:statement con el atributo event-id, que nos servir como identificador de la sentencia ,el atributo jdbc:type con el tipo de sentencia que ejecutamos y el atributo xmlns:jdbc. Luego y como hijo del nodo

jdbc:statement encontramos un nodo jdbc:sql con el codigo SQL de la sentencia que queremos ejecutar. Para ello , dentro de nuestra regla DirXML construiremos el codigo anterior, usando la funcin append XML element() para aadir los nodos, luego a cada uno de los nodos le aadiremos los atributos usando la funcin set XML attribute() y finalmente le aadimos valor usando la funcin append xml text() Observemos la siguiente regla, esta regla aade el cdigo anterior en el documento XML que capturara el evento. <rule> <description>Reflejar cambio en tabla de eventos</description> <comment xml:space=preserve>Inserta un registro en la tabla de eventos de la base de datos.</comment> <conditions> <and> <if-class-name mode=nocase op=equal>User</if-class-name> <if-association op=associated/> <if-operation op=equal>modify</if-operation> </and> </conditions> <action/> <actions> <! Declaramos una variable con la sentencia SQL que queremos ejecutar > <do-set-local-variable name=sql scope=policy> <arg-string>

<token-text xml:space=preserve>insert into eventlog(newvalue,oldvalue,id) values(,</token-text> <token-op-attr name=Given Name/> <token-text xml:space=preserve>,'</token-text> <token-attr name=Given Name/> <token-text xml:space=preserve>,'</token-text> <token-association/> <token-text xml:space=preserve>)</token-text> </arg-string> </do-set-local-variable> <! Aadimos en nodo jdbc:statement > <do-append-xml-element expression=/nds/input name=jdbc:statement/> <! Aadimos atributo jdbc:type > <do-set-xml-attr expression=/nds/input/jdbc:statement name=jdbc:type> <arg-string> <token-text xml:space=preserve>update</token-text> </arg-string> </do-set-xml-attr> <! Aadimos atributo event-id > <do-set-xml-attr expression=/nds/input/jdbc:statement[last()] name=event-id> <arg-string> <token-text xml:space=preserve>0</token-text>

</arg-string> </do-set-xml-attr> <! Aadimos dentro de jdbc:statement un nodo jdbc:sql > <do-append-xml-element expression=/nds/input/jdbc:statement[last()] name=jdbc:sql/> <! Le aadimos el contenido en este caso el de la variable sql definida Como podemos ver , la regla ha aadido el cdigo XML con la sentencia SQL, vamos a explicar las lnea ms relevantes del cdigo : <do-append-xml-element expression=/nds/input name=jdbc:statement/> Aadimos debajo del nodo input que est debajo de nds un nuevo nodo llamado jdbc:statement ( Mirar el documento anterior ) A este nuevo nodo que hemos aadido ( /nds/input/jdbc:statement[last()] ) le aadimos un atributo nuevo llamado jdbc:type con el valor update. Notar que estamos usando XPath para seleccionar los nodos, en este caso el ltimo nodo jdbc:statement debajo de /nds/input , ya que podran haber varios nodos jdbc:statement y el que hemos aadido ahora sabemos que es el ultimo. <do-set-xml-attr expression=/nds/input/jdbc:statement[last()] name=event-id> <arg-string> <token-text xml:space=preserve>0</token-text> </arg-string> </do-set-xml-attr> Aadimos otro atributo al nodo ( /nds/input/jdbc:statement[last()] ) con nombre event-id y valor 0. Este atributo nos ayudara a identificar entre diferentes sentencias sql al usarlo como identificador de sentencia. <do-append-xml-element expression=/nds/input/jdbc:statement[last()] name=jdbc:sql/>

Aadimos debajo el ultimo nodo jdbc:statement hijo de /nds/input un nuevo nodo llamado jdbc:sql <do-append-xml-text expression=/nds/input/jdbc:statement[last()]/jdbc:sql[last()]> <arg-string> <token-local-variable name=sql/> </arg-string> </do-append-xml-text> Ahora seleccionamos dicho nodo (el ltimo nodo jdbc:sql del ltimo nodo jdbc:statement ) y le aadimos contenido , en este caso el contenido de la variable sql definida anteriormente.

Potrebbero piacerti anche