Overview#
Usually when using DirXML, the desire is to make a direct SQL call from the driver to set some values in a Database table.In this case, we needed to set some values within eDirectory based on a SQL Join. Supposedly this can be done within the "normal" setup of the tables, but on our DB2 instance we were unable to make this work.
The code makes a direct SQL call from the driver and places the, possibly multi-values, into an attribute in eDirectory.
Change the Conditions#
For your use, you will probably need to change the conditions as these were more for demonstrative purposes.
Be sure to add the XML namespace to the policy.
Shows a DirXML Example and XPATH Example for working with SQL Calls From Driver (Publisher Channel):
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE policy PUBLIC "policy-builder-dtd" "C:\Program Files\Novell\Designer3\Designer\eclipse\plugins\com.novell.idm.policybuilder_3.0.0.200807211539\DTD\dirxmlscript3.5.1.dtd"><policy xmlns:cmd="http://www.novell.com/nxsl/java/com.novell.nds.dirxml.driver.XdsCommandProcessor"> <rule> <description>Get DB GID</description> <comment xml:space="preserve">We parse the src-dn to get the primary key in the user table that is used in the following query.</comment> <conditions> <and> <if-src-dn op="available"/> </and> </conditions> <actions> <do-set-local-variable name="lv-usergid" scope="policy"> <arg-string> <token-parse-dn dest-dn-format="slash" length="1" src-dn-format="ldap" start="-1"> <token-src-dn convert="false" length="-1"/> </token-parse-dn> </arg-string> </do-set-local-variable> </actions> </rule> <rule> <description>afSupplierSubClass</description> <comment xml:space="preserve">A direct SQL statment that populates the vfSupplierSubClass attribute with the possible multiple values from the query.</comment> <conditions> <or> <if-local-variable name="lv-usergid" op="available"/> </or> </conditions> <actions> <do-if> <arg-conditions> <and> <if-local-variable name="lv-usergid" op="available"/> </and> </arg-conditions> <arg-actions> <do-trace-message/> </arg-actions> <arg-actions> <do-trace-message color="brred"/> <do-break/> </arg-actions> </do-if> <do-set-local-variable name="sql-statement" scope="policy"> <arg-string> <token-text xml:space="preserve">select supplier_class_nam from CORRTEST.so_iam_suppr_class c join CORRTEST.so_iam_usr_suplr_cls_xref x on x.SO_IAM_SUPPR_CLASS_GID = c.SO_IAM_SUPPR_CLASS_GID where so_iam_user_stg_gid=</token-text> <token-local-variable name="lv-usergid"/> </arg-string> </do-set-local-variable> <do-set-local-variable name="query2" scope="policy"> <arg-node-set> <token-xml-parse> <token-text xml:space="preserve"><jdbc:statement xmlns:jdbc="urn:dirxml:jdbc"><jdbc:sql></token-text> <token-xml-serialize> <token-local-variable name="sql-statement"/> </token-xml-serialize> <token-text xml:space="preserve"></jdbc:sql></jdbc:statement></token-text> </token-xml-parse> </arg-node-set> </do-set-local-variable> <do-set-local-variable name="lv-classresult" scope="policy"> <arg-node-set> <token-xpath expression="query:query($srcQueryProcessor, $query2)"/> </arg-node-set> </do-set-local-variable> <do-for-each> <arg-node-set> <token-xpath expression="$lv-classresult//jdbc:value"/> </arg-node-set> <arg-actions> <do-add-dest-attr-value name="vfSupplierSubClass"> <arg-value> <token-local-variable name="current-node"/> </arg-value> </do-add-dest-attr-value> </arg-actions> </do-for-each> </actions> </rule> </policy>