Benutzerdefinierte Skripte für Datenbankanwendungstabellen (Oracle) mit Groovy entwickeln

Benutzerdefiniertes Skripting für Datenbankanwendungstabellen (Oracle) - Überblick

Wenn Sie Accounts in Oracle Access Governance mit der Integration "Datenbanktabellen" bereitstellen, werden Vorgänge wie Erstellen, Aktualisieren und Löschen mit dem standardmäßig bereitgestellten Code implementiert. In Fällen, in denen Sie die standardmäßig bereitgestellten Vorgänge ändern möchten, können Sie optional eigene benutzerdefinierte Skripte bereitstellen, die Ihre eigenen spezifischen Provisioning-Vorgangsanforderungen implementieren. Dieser Schritt ist völlig optional. Sie müssen keine benutzerdefinierten Skripte erstellen, wenn die Standardvorgänge Ihnen die erforderlichen Informationen liefern. Sie können benutzerdefinierte Skripte zu allen unterstützten Vorgängen hinzufügen. Wenn Sie benutzerdefinierte Skripte auswählen, müssen Sie sie nur dort hinzufügen, wo der Standardvorgang geändert werden muss. Sie können eine Kombination aus benutzerdefinierten und Standardskripten für die unterstützten Vorgänge verwenden, obwohl Sie für jeden bestimmten Vorgang nur eine oder die andere Option haben können. Beispiel: Der Vorgang create wird möglicherweise mit einem benutzerdefinierten Skript implementiert, das Ihrer Organisation bestimmte Funktionen hinzufügt, während der Vorgang delete unverändert bleibt und die Standardfunktionalität verwendet.

Nachdem Sie die Datenbankanwendungstabellen für die Verwendung eines benutzerdefinierten Skripts implementiert und konfiguriert haben, wird dieses Skript verwendet, wenn Sie das nächste Mal einen Provisioning- oder Dataload-Vorgang ausführen.
Hinweis

Jedes benutzerdefinierte Skript muss im Groovy-Format implementiert werden. Andere Scripting-Formate werden nicht unterstützt.
Wenn Sie ein orchestriertes System für Datenbankanwendungstabellen erstellen, können Sie Skripte identifizieren, die für eine Reihe von Provisioning-Vorgängen in der Datenbankanwendung ausgeführt werden sollen, die Accountdaten enthalten. Diese Vorgänge sind:
  • Erstellen
  • Aktualisieren
  • Löschen
  • Dataload
  • Beziehungsdaten hinzufügen
  • Beziehungsdaten entfernen
Diese Skripte müssen sich auf dem Agent-Host im Installationsverzeichnis des Agent befinden. Beispiel: /app/<custom script> . Sie konfigurieren den Agent mit dem Speicherort der Skripte in den Integrationseinstellungen für das orchestrierte System. Stellen Sie sicher, dass der Betriebssystembenutzer, auf dem der Agent ausgeführt wird, über Lese-/Schreibberechtigungen für benutzerdefinierte Skripte verfügt.
Wenn Sie eine Provisioning-Aufgabe ausführen, wird das Skript als Ersatz für die Standardverarbeitung ausgeführt, die mit der Aufgabe verknüpft ist. Das Skript muss die Standard-Provisioning-Aufgabe wie "Erstellen" oder "Aktualisieren" verarbeiten und kann auch benutzerdefinierte Aufgaben über den Standard-Provisioning-Prozess hinaus haben, wie z.B.:
  • Benutzerdefinierte Tabellenaktualisierungen ausführen
  • Benutzerdefiniertes Auditing
  • Benutzerdefinierte Benachrichtigungen senden
Das bedeutet, dass Sie zwei Optionen für das Provisioning der Verarbeitung mit der Integration von Datenbankanwendungstabellen haben:
  1. Standardlogik verwenden, die mit dem Connector {\b Database Application Tables} bereitgestellt wird
  2. In Skripten implementierte benutzerdefinierte Logik verwenden
Benutzerdefinierte Skripte werden nur verwendet, wenn sie in Ihrem orchestrierten System konfiguriert sind. Wenn Sie also beim Erstellen des orchestrierten Systems ein Erstellungsskript angegeben haben, aber kein Skript zum Aktualisieren vorhanden ist, wird das benutzerdefinierte Skript für die Aufgabe "Provisioning erstellen" verwendet, während die Aktualisierungsaufgabe mit der Standard-Connector-Verarbeitung implementiert wird.

Beachten Sie außerdem, dass alle benutzerdefinierten Skripttypen für ein orchestriertes System unterstützt werden, das für den Modus des verwalteten Systems konfiguriert ist. Der einzige Skripttyp, der für den zuverlässigen Quellmodus unterstützt wird, ist der Dataload-Typ, der für beide Modi unterstützt wird.

Hinweis

Beispieldatenbankschema

Die in den folgenden Abschnitten bereitgestellten Beispiele basieren auf den in diesem Abschnitt beschriebenen Datenbanktabellen.

MYDBAT_PERSON

CREATE TABLE MYDBAT_PERSON
  (USERID VARCHAR2(50BYTE) NOT NULL ENABLE,
   USERNAME VARCHAR2(50BYTE) NOT NULL ENABLE,
   FIRSTNAME VARCHAR2(50BYTE),
   LASTNAME VARCHAR2(50BYTE),
   EMAIL VARCHAR2(50BYTE) NOT NULL ENABLE,
   COUNTRYCODE VARCHAR2(20BYTE),
   DESCRIPTION VARCHAR2(50BYTE),
   SALARY NUMBER,
   JOININGDATE DATE,
   STATUS VARCHAR2(50BYTE),
   LASTUPDATED TIMESTAMP (6),
   PASSWORD VARCHAR2(50BYTE),
   CONSTRAINT MYDBATPERSON_PK PRIMARY KEY (USERID));

MYDBAT_GROUPS

CREATE TABLE MYDBAT_GROUPS
  (GROUPID VARCHAR2(20BYTE) NOT NULL ENABLE,
   GROUPNAME VARCHAR2(20BYTE) NOT NULL ENABLE,
   CONSTRAINT MYDBATGROUPS_PK PRIMARY KEY (GROUPID));

MYDBAT_ROLES

CREATE TABLE MYDBAT_ROLES
  (ROLEID VARCHAR2(50BYTE) NOT NULL ENABLE,
   ROLENAME VARCHAR2(50BYTE) NOT NULL ENABLE,
   CONSTRAINT MYDBATROLES_PK PRIMARY KEY (ROLEID));

MYDBAT_PERSON_GROUP

CREATE TABLE MYDBAT_PERSON_GROUP
  (USERID VARCHAR2(20BYTE) NOT NULL ENABLE,
   GROUPID VARCHAR2(20BYTE) NOT NULL ENABLE,
   CONSTRAINT "MYDBATPERSONGROUP_PK"PRIMARY KEY (USERID, GROUPID));

MYDBAT_PERSON_ROLE

CREATE TABLE MYDBAT_PERSON_ROLE
  (USERID VARCHAR2(20BYTE) NOT NULL ENABLE,
   ROLEID VARCHAR2(20BYTE) NOT NULL ENABLE,
   FROMDATE DATE,
   TODATE DATE,
   CONSTRAINT "MYDBATPERSONROLE_PK"PRIMARY KEY (USERID, ROLEID));

MYDBAT_COUNTRY

CREATE TABLE MYDBAT_COUNTRY
  (COUNTRYCODE VARCHAR2(20BYTE) NOT NULL ENABLE,
   COUNTRYNAME VARCHAR2(200BYTE) NOT NULL ENABLE,
   CONSTRAINT MYDBAT_COUNTRY_PK PRIMARY KEY (COUNTRYCODE));
Hinweis

Für untergeordnete Tabellen wie mydbat_roles, mydbat_groups und mydbat_country muss ein Primärschlüssel-Constraint definiert sein. Wenn kein Primärschlüssel für untergeordnete Tabellen definiert ist, verläuft die Validierung nicht erfolgreich, und es wird ein Fehler angezeigt: Schlüssel für Tabelle <tablename> sind nicht definiert.

Trigger und Sequenz für automatische Erhöhung

Der folgende Code erstellt eine Sequence und einen Trigger, der automatisch eine USERID zuweist, wenn ein Benutzer in der Tabelle MYDBAT_PERSON erstellt wird.
CREATE SEQUENCE MYDBAT_PERSON_SEQ MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT
      BY 1 START WITH 1 CACHE 20 NOORDER NOCYCLE;
create or replace TRIGGER DBAT_PERSON_TRG
BEFORE INSERT ON MYDBAT_PERSON
FOR EACH ROW
BEGIN
  <<COLUMN_SEQUENCES>>
  BEGIN IF INSERTING AND :NEW.USERID IS NULL THEN
    SELECT MYDBAT_PERSON_SEQ.NEXTVAL INTO :NEW.USERID FROM SYS.DUAL;
  END IF;
  END COLUMN_SEQUENCES;END;

Groovy-Skriptargumente

Die folgenden Argumente können in Groovy-Skripten verwendet werden:

Skript-Argumente
Argument Beschreibung
Connector Das Connector-Objekt {\b Database Application Tables}.
Timing

Wenn das Groovy-Skript aufgerufen wird. Das timing-Attribut erläutert auch den Typ des ausgeführten Vorgangs. Beispiel: Wenn es sich um einen Suchvorgang handelt, wird auch die Objektklasse zurückgegeben, die durchsucht wird.

Das Format des Zeitarguments für die Lookup-Feldsynchronisierung lautet:
executeQuery:OBJECT_CLASS
In diesem Format wird OBJECT_CLASS durch den Typ des abzustimmenden Objekts ersetzt.
Beispiel: Bei einem geplanten Job für die Lookup-Feldsynchronisierung, der den Objekttyp Rolle enthält, lautet der Wert des Timingarguments wie folgt:
executeQuery:Role
Attribute Alle Attribute.
Trace Logger als Script Trace Bridge zur Anwendung
wobei Zeichenfolge mit Bedingung für "Abfrage ausführen" oder Null.
Handler resultSetHandler oder SyncResultsHandler für die Connector-Objekte, die von der Ausführungsabfrage, dem Synchronisierungsvorgang oder der Nullrückgabe erzeugt werden.
Angebotserstellung Der Typ des Tabellennamens, der in SQL verwendet wird. Der Standardwert ist eine leere Zeichenfolge. Der Wert dieses Arguments wird aus den Integrationseinstellungen abgerufen.
nativeTimestamps Gibt an, ob das Skript die Zeitstempeldaten der Spalten als Typ java.sql.Timestamp aus der Datenbanktabelle abruft. Diese Informationen werden aus den Integrationseinstellungen abgerufen.
allNative Gibt an, ob das Skript den Datentyp der Spalten in einem nativen Format aus der Datenbanktabelle abrufen muss. Der Wert dieses Arguments wird aus den Integrationseinstellungen abgerufen. Der Wert dieses Arguments gibt an, ob das Skript Ausnahmen auslösen muss, wenn ein Null-Fehlercode (0x00) aufgetreten ist.
enableEmptyString Gibt an, ob die Unterstützung für das Schreiben einer leeren Zeichenfolge anstelle eines NULL-Wertes aktiviert werden muss. Der Wert dieses Arguments wird aus den Integrationseinstellungen abgerufen.
filterString Zeichenfolgenfilterbedingung für "Abfrage ausführen" oder Null.
filterParams Liste der Filterparameter. Jeder Parameter ist im Format COLUMN_NAME:VALUE vorhanden. Beispiel: FIRSTNAME:test.
Synchronisierungsattribute Name der Datenbankspalte, die für die inkrementelle Abstimmung konfiguriert ist. Dieses Argument ist im Synchronisierungsskript verfügbar, das während einer inkrementellen Abstimmungsausführung aufgerufen wird.
Synctoken Wert des Synchronisierungsattributs. Dieses Argument ist im Synchronisierungsskript verfügbar.

Beispiel für Dataload-Skript

Das Dataload-Skript liest die Daten aus allen Tabellen für alle definierten Entitys. In diesem Szenario bezieht sich der Begriff Dataload auf den vollständigen Dataload und den Lookup-Dataload.

Dieses Beispielskript liest Benutzerdaten aus der Tabelle MYDBAT_PERSON und die Beziehungsdaten der Benutzer aus den Tabellen MYDABAT_PERSON_ROLE und MYDBAT_PERSON_GROUP. Berechtigungsdaten werden aus der Tabelle MYDBAT_GROUPS gelesen, und Lookup-Daten werden aus der Tabelle MYDBAT_COUNTRY gelesen. Außerdem wird eine einfache Filtersuche in der Tabelle MYDBAT_PERSON unterstützt. Alle diese Daten werden mit Stored Procedures gelesen.

Dataload-Skript

import java.sql.CallableStatement;
import java.sql.Connection;
import java.math.*;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.identityconnectors.framework.common.objects.*;
import java.lang.reflect.*;
import java.lang.String;
import org.identityconnectors.common.security.GuardedString;
import java.text.*;
 
ResultSet rs = null;
        CallableStatement st = null;
        String ocName ;
        try {
            if( timing != "")
            {
                trace.info("[Execute Query] timing attribute value : "+ timing);
                ocName = timing.split(":")[1]
            }
 
            trace.info("[Execute Query] for objectClass : "+ ocName);
             
            if(ocName.equals("ACCOUNT") || ocName.equals("TARGETACCOUNT")){
            if( filterString != "")
            {
                trace.info("[Execute Query] Performing Recon with Filter. Filter is::"+ filterString+" And Filer Params are::"+filterParams);
                //[Execute Query] Performing Recon with Filter. Filter is::MYDBAT_PERSON.USERID = ? And Filer Params are::[MYDBAT_PERSON.USERID:21]
                String[] filter = filterParams.get(0).split(":");
                st = conn.prepareCall("{call EXECUTE_QUERY_WITH_FILTER(?,?,?)}");
                st.setString(2, filter[0]);
                st.setString(3, filter[1]);
            }
            else
            {
                trace.info("[Execute Query] Performing Full Recon.");
                st = conn.prepareCall("{call EXECUTE_QUERY_PERSON(?)}");
            }
            st.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);
            st.execute();
            rs = (ResultSet) st.getObject(1);
            SimpleDateFormat targetFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
            DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
 
            while (rs.next()) {
                ConnectorObjectBuilder cob = new ConnectorObjectBuilder();
                cob.setObjectClass(ObjectClass.ACCOUNT);
                Attribute fname= AttributeBuilder.build(new String("FIRSTNAME"),rs.getString(2));
                Attribute lname= AttributeBuilder.build(new String("LASTNAME"),rs.getString(3));
                Attribute uid= AttributeBuilder.build(new String("__UID__"),rs.getString(1));
                Attribute name= AttributeBuilder.build(new String("__NAME__"),rs.getString(10));
                Attribute email= AttributeBuilder.build(new String("EMAIL"),rs.getString(4));
                //Attribute salary= AttributeBuilder.build(new String("SALARY"),rs.getBigDecimal(6));
                Attribute description= AttributeBuilder.build(new String("DESCRIPTION"),rs.getString(5));
                Date dbDate = rs.getDate(7);
                String joinDateStr = null;
                Long joinDate = null;
                if( null != dbDate)
                {
                    java.util.Date date= df.parse(dbDate.toString());
                    joinDateStr = targetFormat.format(date);
                    joinDate = date.getTime()
                    trace.info("date : " +date +" ---- joinDate : "+ joinDate);
                }
 
                //Attribute joindate= AttributeBuilder.build(new String("JOININGDATE"),joinDateStr);
                if(null != joinDate) {
                    trace.info("Setting joinDate : "+ joinDate);
                    Attribute joindate= AttributeBuilder.build(new String("JOININGDATE"),joinDate);
                    cob.addAttribute(joindate);
                }
                Attribute status= AttributeBuilder.build(new String("STATUS"),rs.getString(8));
                Attribute countryCode= AttributeBuilder.build(new String("COUNTRYCODE"),rs.getString(9));
                cob.addAttribute(fname);
                cob.addAttribute(lname);
                cob.addAttribute(uid);
                cob.addAttribute(name);
                cob.addAttribute(email);
                //cob.addAttribute(salary);
                cob.addAttribute(description);
                cob.addAttribute(status);
                cob.addAttribute(countryCode);
 
                if(ocName.equals("TARGETACCOUNT")){
                CallableStatement roleStmt = conn.prepareCall("{call GET_USERROLE(?,?)}");
                roleStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
                roleStmt.setString(2, rs.getString(1));
                roleStmt.execute();
                ResultSet roleResultSet = (ResultSet) roleStmt.getObject(1);
                java.util.List<EmbeddedObject> eoList = new ArrayList<EmbeddedObject>();
                while (roleResultSet.next()) {
                    Attribute roleId= AttributeBuilder.build(new String("ROLEID"),roleResultSet.getString(2));
                    dbDate = roleResultSet.getDate(3);
                    String fromDateStr = null;
                    Long fromDate = null;
                    if( null != dbDate)
                    {
                        java.util.Date date= df.parse(dbDate.toString());
                        fromDateStr = targetFormat.format(date);
                        fromDate = date.getTime()
                    }
 
                    dbDate = roleResultSet.getDate(4);
                    String toDateStr = null;
                    Long toDate = null;
                    if( null != dbDate)
                    {
                        java.util.Date date= df.parse(dbDate.toString());
                        toDateStr = targetFormat.format(date);
                        toDate = date.getTime()
                    }
                     
                    EmbeddedObjectBuilder roleEA = new EmbeddedObjectBuilder();
                    roleEA.addAttribute(roleId);
                    if(null != fromDate) {
                        trace.info("Setting roles fromDate : "+ fromDate);
                        Attribute fromdate= AttributeBuilder.build(new String("FROMDATE"),fromDate);
                        roleEA.addAttribute(fromdate);
                    }
 
                    if(null != toDate) {
                        trace.info("Setting roles toDate : "+ toDate);
                        Attribute todate= AttributeBuilder.build(new String("TODATE"),toDate);
                        roleEA.addAttribute(todate);
                    }
 
                    roleEA.setObjectClass(new ObjectClass("MYDBAT_ROLES"));
                    eoList.add(roleEA.build());
                }
                roleResultSet.close();
                roleStmt.close();
                EmbeddedObject[] roleEm = eoList.toArray(new EmbeddedObject[eoList.size()]);
                cob.addAttribute(AttributeBuilder.build("MYDBAT_PERSON_ROLE", (Object[]) roleEm));
 
                CallableStatement groupStmt = conn.prepareCall("{call GET_USERGROUP(?,?)}");
                groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
                groupStmt.setString(2, rs.getString(1));
                groupStmt.execute();
                ResultSet groupResultSet = (ResultSet) groupStmt.getObject(1);
                java.util.List<EmbeddedObject> geoList = new ArrayList<EmbeddedObject>();
                while (groupResultSet.next()) {
                    Attribute groupId= AttributeBuilder.build(new String("GROUPID"),groupResultSet.getString(2));
                    EmbeddedObjectBuilder groupEA = new EmbeddedObjectBuilder();
                    groupEA.addAttribute(groupId);
                    groupEA.setObjectClass(new ObjectClass("MYDBAT_GROUPS"));
                    geoList.add(groupEA.build());
                }
                groupResultSet.close();
                groupStmt.close();
                EmbeddedObject[] groupEm = geoList.toArray(new EmbeddedObject[geoList.size()]);
                cob.addAttribute(AttributeBuilder.build("MYDBAT_PERSON_GROUP", (Object[]) groupEm));
                }
 
                if(!handler.handle(cob.build())) return;
            }
    }else if(ocName.equals("MYDBAT_COUNTRY")){
        trace.info("[Execute Query] for Lookup : "+ ocName);
        CallableStatement groupStmt = conn.prepareCall("{call GET_COUNTRIES(?)}");
        groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
        groupStmt.execute();
        ResultSet groupResultSet = (ResultSet) groupStmt.getObject(1);
        while (groupResultSet.next()) {
            ConnectorObjectBuilder cob = new ConnectorObjectBuilder();
            cob.setObjectClass(new ObjectClass("MYDBAT_COUNTRY"));
            Attribute groupId= AttributeBuilder.build(new String("__UID__"),groupResultSet.getString(1));
            Attribute groupName= AttributeBuilder.build(new String("__NAME__"),groupResultSet.getString(2));
            cob.addAttribute(groupId);
            cob.addAttribute(groupName);
            if(!handler.handle(cob.build())) return;
        }
         
        groupResultSet.close();
        groupStmt.close();
    }else if(ocName.equals("MYDBAT_GROUPS")){
        trace.info("[Execute Query] for Entitlement : "+ ocName);
        CallableStatement groupStmt = conn.prepareCall("{call GET_GROUPS(?)}");
        groupStmt.registerOutParameter(1, oracle.jdbc.driver.OracleTypes.CURSOR);
        groupStmt.execute();
        ResultSet groupResultSet = (ResultSet) groupStmt.getObject(1);
        while (groupResultSet.next()) {
            ConnectorObjectBuilder cob = new ConnectorObjectBuilder();
            cob.setObjectClass(new ObjectClass("MYDBAT_GROUPS"));
            Attribute groupId= AttributeBuilder.build(new String("__UID__"),groupResultSet.getString(1));
            Attribute groupName= AttributeBuilder.build(new String("__NAME__"),groupResultSet.getString(2));
            cob.addAttribute(groupId);
            cob.addAttribute(groupName);
            if(!handler.handle(cob.build())) return;
        }
         
        groupResultSet.close();
        groupStmt.close();
    }
    } finally {
            if( null != rs)
                rs.close();
            if( null != st)
                st.close();
        }

Gespeicherte Prozedur: Benutzer laden

create or replace PROCEDURE EXECUTE_QUERY_PERSON
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
  SELECT USERID,
         FIRSTNAME,
         LASTNAME,
         EMAIL,
         DESCRIPTION,
         SALARY,
         JOININGDATE,
         STATUS,
         COUNTRYCODE,
         USERNAME
  FROM MYDBAT_PERSON;
END EXECUTE_QUERY_PERSON;

Gespeicherte Prozedur: Gefilterte Benutzersuche

create or replace PROCEDURE EXECUTE_QUERY_WITH_FILTER
(user_cursor OUT SYS_REFCURSOR,
 filter IN VARCHAR2,
 filterValue IN VARCHAR2) AS
BEGIN
  OPEN user_cursor FOR
    SELECT USERID,
           FIRSTNAME,
           LASTNAME,
           EMAIL,
           DESCRIPTION,
           SALARY,
           JOININGDATE,
           STATUS,
           COUNTRYCODE,
           USERNAME 
    FROM MYDBAT_PERSON
    WHERE filter=filterValue;
END EXECUTE_QUERY_WITH_FILTER;
Dies ist ein sehr einfaches Beispiel für die Filtersuche mit nur einer Filterbedingung. Beispiel: MYDBAT_PERSON.USERID:21. Wird speziell für die writeBack-Verarbeitung nach dem Erstellungsvorgang verwendet

Gespeicherte Prozedur: Rollen abrufen

create or replace PROCEDURE GET_ROLES
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
    SELECT ROLEID,
           ROLENAME
    FROM MYDBAT_ROLES;
END GET_ROLES;

Gespeicherte Prozedur: Benutzerrollen abrufen

create or replace PROCEDURE GET_USERROLE
(user_cursor OUT SYS_REFCURSOR,
 userin IN VARCHAR2) AS
BEGIN
  OPEN user_cursor FOR
    SELECT USERID,
           ROLEID,
           FROMDATE,
           TODATE
    FROM MYDBAT_PERSON_ROLE
    WHERE USERID=userin;
END GET_USERROLE;

Gespeicherte Prozedur: Gruppen abrufen

create or replace PROCEDURE GET_GROUPS
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
    SELECT GROUPID,
           GROUPNAME
    FROM MYDBAT_GROUPS;
END GET_GROUPS;

Gespeicherte Prozedur: Benutzergruppen abrufen

create or replace PROCEDURE GET_USERGROUP
(user_cursor OUT SYS_REFCURSOR,
 userin IN VARCHAR2) AS
BEGIN
  OPEN user_cursor FOR
    SELECT USERID,
           GROUPID 
    FROM MYDBAT_PERSON_GROUP 
    WHERE USERID=userin;
END GET_USERGROUP;

Gespeicherte Prozedur: Lookups abrufen (Land)

create or replace PROCEDURE GET_COUNTRIES
(user_cursor OUT SYS_REFCURSOR) AS
BEGIN
  OPEN user_cursor FOR
    SELECT COUNTRYCODE,
           COUNTRYNAME
    FROM MYDBAT_COUNTRY;
END GET_COUNTRIES;

Beispielerstellungsskript

Dieses Skript wird beim Provisioning eines neuen Accounts aus Oracle Access Governance aufgerufen. Hier werden Daten in die Tabelle MYDBAT_PERSON eingefügt.

Skript erstellen

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.*;
import java.util.Date.*;
import org.identityconnectors.common.security.GuardedString;
import org.identityconnectors.framework.common.objects.*;
 
import java.text.*;
 
// START HERE
trace.info("[Create-Groovy] Attributes::"+attributes);
//USERID,PASSWORD,USERNAME,STATUS,EMAIL,FIRSTNAME,LASTNAME,ORGANIZATION,CITY,EMPLOYEE_NUMBER,joiningdate,ENDDATE,LONGVALUE,FLOATVALUE,CHARVALUE
//Get all the attributes from script argument
 
// This shows how to read arrtibures
 
 
String uid = attributes.get("__NAME__")!=null? attributes.get("__NAME__").getValue().get(0):null;
GuardedString pass = attributes.get("__PASSWORD__")!=null? attributes.get("__PASSWORD__").getValue().get(0):null;
String uname = attributes.get("__NAME__")!=null? attributes.get("__NAME__").getValue().get(0):null;
enableValue = attributes.get("__ENABLE__")!=null? attributes.get("__ENABLE__").getValue().get(0):true;
String email=attributes.get("EMAIL")!=null? attributes.get("EMAIL").getValue().get(0):null;
String first=attributes.get("FIRSTNAME")!=null? attributes.get("FIRSTNAME").getValue().get(0):null;
String last=attributes.get("LASTNAME")!=null? attributes.get("LASTNAME").getValue().get(0):null;
String org=attributes.get("ORGANIZATION")!=null? attributes.get("ORGANIZATION").getValue().get(0):null;
String countryCode=attributes.get("COUNTRYCODE")!=null? attributes.get("COUNTRYCODE").getValue().get(0):null;
joiningdate = attributes.get("JOININGDATE")!=null? attributes.get("JOININGDATE").getValue().get(0):null;
 
 
PreparedStatement createStmt = null;
String ret =null;
try {
         
        //Call Target API to create a user
        createStmt =   conn.prepareStatement("INSERT INTO MYDBAT_PERSON(USERID,PASSWORD,USERNAME,STATUS,EMAIL,FIRSTNAME,LASTNAME,COUNTRYCODE,JOININGDATE) VALUES(?,?,?,?,?,?,?,?,?)");
        createStmt.setString(1, uid);
        if(pass!=null)
        {
        pass.access(new GuardedString.Accessor(){
       public void access(char[] clearChars) {  createStmt.setString(2, new String(clearChars));}
        });
        }
        else
        createStmt.setString(2,null);
         
        createStmt.setString(3, uname);
 
        if(enableValue)
                createStmt.setString(4,"Enabled");
        else
                createStmt.setString(4,"Disabled");
        createStmt.setString(5, email);
        createStmt.setString(6, first);
        createStmt.setString(7, last);
        createStmt.setString(8, countryCode);   
 
        DateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
 
        if (joiningdate!=null)
        {
            if (joiningdate == 0){
                createStmt.setString(9,null);
            }
            else
        {
        Date da=new Date(joiningdate);
        st=formatter.format(da);
        createStmt.setString(9,st);
 
        }
        }
 
       createStmt.executeUpdate();
         
} finally{
        //close the sql statements
        if (createStmt != null)
                createStmt.close();
}
trace.info("[Create] Created User::"+uid);
//Return Uid from the script
return new Uid(uid);

Beispiel für "Untergeordnetes Skript hinzufügen"

Dieses Skript wird beim Provisioning von Berechtigungen/Berechtigungen für Benutzer aus Oracle Access Governance aufgerufen. Hier werden Daten in die Tabellen MYDBAT_PERSON_GROUP und MYDBAT_PERSON_ROLE eingefügt.

Untergeordnetes Skript hinzufügen

import org.identityconnectors.framework.common.objects.*;
import java.text.*;
 
trace.info("[addMultiValuedAttributeScript-Groovy] Adding Child data::"+ attributes);
childst =null;
try {
        //Adding Group data
         
        childDataEOSet = null;
         
        //The child attributes are returned as a set of embedded objects. Each  Embedded object
        // will provide a row of data in the child table.
         
        // Logic for handling simple multi valued attributes
         
        if(attributes.get("MYDBAT_PERSON_GROUP")!=null)
        {
                 
                childDataEOSet=attributes.get("MYDBAT_PERSON_GROUP").getValue();
                childst=conn.prepareStatement("INSERT INTO MYDBAT_PERSON_GROUP VALUES (?,?)");
                String id = attributes.get("__UID__").getValue().get(0);
 
                if(childDataEOSet !=null){
                        //Iterate through child data and insert into table
                        trace.info("[addMultiValuedAttributeScript] Adding Group data.");
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                                eo = iterator.next();
                                attrsSet=eo.getAttributes();
                                grpattr=AttributeUtil.find("GROUPID",attrsSet);
                                 if(grpattr!=null){
                                        // You are iterating simple multi valued attributes here, Call target APIs here
                                        //conn object is available here
                                        groupid=grpattr.getValue().get(0);
                                         
                                        childst.setString(1, id);
                                        childst.setString(2, groupid);
                                        childst.executeUpdate();
                                        childst.clearParameters();
                                }
                        };
                }
        }
} finally {
        if (childst != null)
        childst.close();
         
};
 
try {
        childDataEOSet = null;
        // Logic for handling Complex multi valued attributes
        if(attributes.get("MYDBAT_PERSON_ROLE")!=null)
        {
                 
                childDataEOSet=attributes.get("MYDBAT_PERSON_ROLE").getValue();
                childst=conn.prepareStatement("INSERT INTO MYDBAT_PERSON_ROLE VALUES (?,?,?,?)");
 
                String id = attributes.get("__UID__").getValue().get(0);
 
                if(childDataEOSet !=null)
                {
                        trace.info("[addMultiValuedAttributeScript] Adding Role data.");
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                                eo = iterator.next();
                                attrsSet = eo.getAttributes(); // Get all the attributes of child object
                                roleattr=AttributeUtil.find("ROLEID",attrsSet);
                                 
                                 
                                // You are iterating complex multi valued attributes here, Call target APIs here
                            //conn object is available here
                                if(roleattr!=null){
                                        // You are iterating simple multi valued attributes here, Call target APIs here
                                        //conn object is available here
                                        roleid=roleattr.getValue().get(0);
                                        fromDate=AttributeUtil.find("FROMDATE",attrsSet).getValue().get(0);
                                        toDate=AttributeUtil.find("TODATE",attrsSet).getValue().get(0);
                                 
                                        childst.setString(1, id);
                                        childst.setString(2, roleid);
                                        Date from_date=new Date(fromDate);
                                        SimpleDateFormat formatter = new SimpleDateFormat("dd-MMM-yy");
                                        String from_date_st=formatter.format(from_date);
                                        childst.setString(3, from_date_st);
 
                                        Date to_date=new Date(toDate);
                                        String to_date_st=formatter.format(to_date);
                                        childst.setString(4, to_date_st);
                                         
 
                                        childst.executeUpdate();
                                        childst.clearParameters();
                                }
 
                        };
                }
        }
} finally {
if (childst != null)
                childst.close();
         
};

Beispiel: Untergeordnetes Skript entfernen

Dieses Skript wird beim Deprovisioning von Berechtigungen/Berechtigungen von Benutzern aus Oracle Access Governance aufgerufen. Hier werden Daten mit Stored Procedures aus den Tabellen MYDBAT_PERSON_GROUP und MYDBAT_PERSON_ROLE entfernt.

Untergeordnetes Skript entfernen

import org.identityconnectors.framework.common.objects.*;
 
trace.info("[removeMultiValuedAttributeScript] Removing Child data::"+ attributes);
 
try {
        childDataEOSet = null;
        delSt = null;
        //Get UID
        String id      = attributes.get("__UID__").getValue().get(0);
        if(attributes.get("MYDBAT_PERSON_GROUP")!=null)
        {
                childDataEOSet=attributes.get("MYDBAT_PERSON_GROUP").getValue();
                //Delete child data using stored procedure
                delSt= conn.prepareCall("{call DELETE_USERGROUP(?,?)}");
            if(childDataEOSet !=null){
                        trace.info("[removeMultiValuedAttributeScript] Removing Group data.");
                        //Iterate through child data and delete
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                                eo = iterator.next();
                                attrsSet = eo.getAttributes();
                                grpattr=AttributeUtil.find("GROUPID",attrsSet);
                                if(grpattr!=null){
                                        groupid=grpattr.getValue().get(0);
                                        delSt.setString(1, id);
                                        delSt.setString(2, groupid);
                                        delSt.executeUpdate();
                                        trace.info("[removeMultiValuedAttributeScript] Deleted Group::"+ grpattr);
                                }
                        };
                }
 
        }
} finally {
        if (delSt != null)
        delSt.close();
};
 
try {
        childDataEOSet = null;
        delSt = null;
        String id      = attributes.get("__UID__").getValue().get(0);
        if(attributes.get("MYDBAT_PERSON_ROLE")!=null)
        {
                childDataEOSet=attributes.get("MYDBAT_PERSON_ROLE").getValue();
                delSt= conn.prepareCall("{call DELETE_USERROLE(?,?)}");
            if(childDataEOSet !=null){
                        trace.info("[removeMultiValuedAttributeScript] Removing Role data.");
                        for( iterator = childDataEOSet.iterator(); iterator.hasNext(); )
                        {
                         
                                eo = iterator.next();
                                attrsSet = eo.getAttributes();
                                roleattr=AttributeUtil.find("ROLEID",attrsSet);
                                if(roleattr!=null){
                                        rolename=roleattr.getValue().get(0);
                                        delSt.setString(1, id);
                                        delSt.setString(2, rolename);
                                        delSt.executeUpdate();
                                        trace.info("[removeMultiValuedAttributeScript] Deleted Role::"+ rolename);
                                }
                        };
                }
        }
} finally {
        if (delSt != null)
                delSt.close();
};

Gespeicherte Prozedur: Untergeordnetes Element entfernen

create or replace PROCEDURE DELETE_USERGROUP
(user_id MYDBAT_PERSON_group.USERID%TYPE,
 group_id MYDBAT_PERSON_group.GROUPID%TYPE ) AS
BEGIN
  DELETE FROM MYDBAT_PERSON_group
  WHERE groupid=group_id 
  AND userid=user_id;
END DELETE_USERGROUP; 

create or replace PROCEDURE DELETE_USERROLE
(user_id MYDBAT_PERSON_ROLE.USERID%TYPE,
 role_id MYDBAT_PERSON_ROLE.ROLEID%TYPE) AS
BEGIN
  DELETE FROM MYDBAT_PERSON_ROLE
  WHERE userid=user_id and roleid=role_id;
END DELETE_USERROLE;

Beispiel für Löschskript

Dieses Skript wird während des Widerrufs eines Accounts in Oracle Access Governance aufgerufen. Hier werden die Daten-Benutzerbeziehungstabellen MYDBAT_PERSON_ROLE und MYDBAT_PERSON_GROUP sowie Daten aus der Tabelle MYDBAT_PERSON gelöscht

Skript löschen

import java.sql.PreparedStatement;
import org.identityconnectors.framework.common.objects.*;
  
//Get the UID from the input map 'attributes'
String uid = attributes.get("__UID__").getValue().get(0);
trace.info("[Delete-Groovy] Deleting user:: "+ uid);
  
try {
    //Delete data from child tables and then, main table
    //Delete user roles
    st = conn.prepareStatement("DELETE FROM MYDBAT_PERSON_ROLE WHERE USERID=?");
    st.setString(1, uid);
    st.executeUpdate();
    st.close();
     
    //Delete user groups
    st = conn.prepareStatement("DELETE FROM MYDBAT_PERSON_GROUP WHERE USERID=?");
    st.setString(1, uid);
    st.executeUpdate();
    st.close();
     
    //Delete user account
    st = conn.prepareStatement("DELETE FROM MYDBAT_PERSON WHERE USERID=?");
    st.setString(1, uid);
    st.executeUpdate();
} finally {
    if (st != null)
        st.close(); };
trace.info("Deleted user:: "+ uid);

Beispielaktualisierungsskript

Dieses Skript wird während Provisioning-Vorgängen aufgerufen, wenn der Account aus Oracle Access Governance aktualisiert wird. Hier aktualisieren wir die Daten in der Tabelle MYDBAT_PERSON

Skript aktualisieren

import org.identityconnectors.framework.common.objects.*;
import java.text.*;
import org.identityconnectors.framework.common.exceptions.*;
  
trace.info("[Update-Groovy] Atrributes::"+ attributes);
  
/** During an Update operation,AGCS  sends the UID attribute along with updated attributes.
Get all the values of attributes **/
  
String id = attributes.get("__UID__")!=null? attributes.get("__UID__").getValue().get(0):null;
String firstName=attributes.get("FIRSTNAME")!=null? attributes.get("FIRSTNAME").getValue().get(0):null;
String lastName=attributes.get("LASTNAME")!=null? attributes.get("LASTNAME").getValue().get(0):null;
String email=attributes.get("EMAIL")!=null? attributes.get("EMAIL").getValue().get(0):null;
String description=attributes.get("DESCRIPTION")!=null? attributes.get("DESCRIPTION").getValue().get(0):null;
salary=attributes.get("SALARY")!=null? attributes.get("SALARY").getValue().get(0):null;
joindate = attributes.get("JOININGDATE")!=null? attributes.get("JOININGDATE").getValue().get(0):null;
enableValue = attributes.get("__ENABLE__")!=null? attributes.get("__ENABLE__").getValue().get(0):true;
  
//Throw exception if uid is null
if(id==null) throw new ConnectorException("UID Cannot be Null");
    stmt = null;
try {
//Create prepared statement to update the MYDBAT_PERSON table
        stmt = conn.prepareStatement("UPDATE MYDBAT_PERSON SET FIRSTNAME=COALESCE(?, FIRSTNAME),LASTNAME =COALESCE(?, LASTNAME), EMAIL= COALESCE(?, EMAIL),SALARY=COALESCE(?, SALARY),JOININGDATE=COALESCE(to_date(?,'dd-Mon-yy'), JOININGDATE),STATUS=COALESCE(?, STATUS) WHERE USERID =?");
        //Set sql input parameters
        stmt.setString(1, firstName);
        stmt.setString(2, lastName);
        stmt.setString(3, email);
        stmt.setBigDecimal(4, new BigDecimal(salary));
        dateStr = null;
        //Convert the joindate into oracle date format
        if( joindate != null) {
            Date date=new Date(joindate);
            DateFormat targetFormat = new SimpleDateFormat("dd-MMM-yy");
            dateStr = targetFormat.format(date);
        }
        stmt.setString(5,dateStr);
        if(enableValue)
            stmt.setString(6,"Enabled");
        else
            stmt.setString(6,"Disabled");
        stmt.setString(7, id);
        stmt.executeUpdate();
} finally {
    if (stmt != null)
        stmt.close();
};
trace.info("[Update] Updated user::"+ id);
return new Uid(id);