Desenvolver Scripts Personalizados para Tabelas de Aplicativos de Banco de Dados (Oracle) Usando Groovy

Visão Geral do Custom Scripting for Database Application Tables (Oracle)

Quando você provisiona contas do Oracle Access Governance usando a integração de Tabelas de Aplicativos de Banco de Dados, operações como criar, atualizar e excluir são implementadas usando o código fornecido padrão. Em ocasiões em que deseja modificar as operações fornecidas padrão, você pode opcionalmente fornecer seus próprios scripts personalizados que implementam seus próprios requisitos de operação de provisionamento específicos. Esta etapa é totalmente opcional, não será necessário criar scripts personalizados se as operações padrão fornecerem o que você precisa. É possível adicionar scripts personalizados a qualquer operação suportada. Se você escolher scripts personalizados, só precisará adicioná-los quando precisar que a operação padrão seja modificada, poderá ter uma combinação de scripts personalizados e padrão para as operações suportadas, embora você possa ter apenas uma ou outra opção para cada operação específica. Por exemplo, a operação criar pode ser implementada com um script personalizado que adiciona alguma funcionalidade específica à sua organização, enquanto a operação excluir permanece inalterada e usa a funcionalidade padrão.

Depois de implementar e configurar suas Tabelas de Aplicativos de Banco de Dados para usar um script personalizado, esse script será usado na próxima vez que você executar uma operação de provisionamento ou carregamento de dados.
Observação

Qualquer script personalizado deve ser implementado usando o formato Groovy. Outros formatos de script não são suportados.
Ao criar um sistema orquestrado de Tabelas de Aplicativos de Banco de Dados, você pode identificar scripts a serem executados para várias operações de provisionamento no aplicativo de banco de dados que contém dados da conta. Estas operações são:
  • Criar
  • Atualizar
  • Excluir
  • Carga de dados
  • Adicionar dados de relacionamento
  • Remover dados de relacionamento
Esses scripts devem estar localizados no host do agente, no diretório de instalação do agente, por exemplo, /app/<custom script> . Você configura o agente com o local dos scripts nas definições de integração do sistema orquestrado. Certifique-se de que o usuário do sistema operacional que está executando o agente tenha permissões de leitura/gravação para qualquer script personalizado.
Quando você executar uma tarefa de provisionamento, seu script será executado como um substituto para o processamento padrão associado à tarefa. O script deve tratar a tarefa de provisionamento padrão, como criar ou atualizar, e também pode ter tarefas personalizadas acima e além do processo de provisionamento padrão, como:
  • Executar atualizações de tabela personalizadas
  • Auditoria personalizada
  • Enviar notificações personalizadas
Isso significa que você tem duas opções para o processamento de provisionamento usando a integração das Tabelas de Aplicativos de Banco de Dados:
  1. Usar a lógica padrão fornecida com o conector Tabelas de Aplicativos de Banco de Dados
  2. Usar a lógica personalizada implementada em scripts
Os scripts personalizados só são usados quando configurados no sistema orquestrado. Portanto, se você tiver especificado um script de criação ao criar seu sistema orquestrado, mas não houver script para atualização, o script personalizado será usado para a tarefa de criação de provisionamento, enquanto a tarefa de atualização será implementada usando o processamento do conector padrão.

Você também deve observar que todos os tipos de script personalizados são suportados para um sistema orquestrado configurado para o modo de sistema gerenciado. O único tipo de script suportado para o modo de origem autorizado é o tipo de carga de dados, que é suportado para ambos os modos.

Observação

Exemplo de Esquema de Banco de Dados

As amostras fornecidas nas seções a seguir se baseiam nas tabelas de banco de dados descritas nesta seção.

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));
Observação

As tabelas filhas, como mydbat_roles, mydbat_groups e mydbat_country, devem ter uma restrição de chave primária definida. Se nenhuma chave primária for definida para tabelas filhas, sua operação de validação falhará e você verá um erro. A chave para a tabela <tablename> não está definida.

Acionador e Sequência para Incremento Automático

O código a seguir criará uma sequência e um trigger que designará automaticamente um USERID ao criar um usuário na tabela MYDBAT_PERSON.
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;

Argumentos do Script Groovy

Os seguintes argumentos podem ser usados em seus scripts Groovy:

Argumentos do Script
Argumento Descrição
conector O objeto do conector Tabelas do Aplicativo de Banco de Dados.
tempo

Quando o script Groovy é chamado. O atributo de tempo também explica o tipo de operação que está sendo executada. Por exemplo, se for uma operação de pesquisa, a classe de objeto que está sendo pesquisada também será retornada.

Este é o formato do argumento de tempo para sincronização do campo de pesquisa:
executeQuery:OBJECT_CLASS
Neste formato, OBJECT_CLASS é substituído pelo tipo de objeto que está sendo reconciliado.
Por exemplo, para um job programado de sincronização de campo de consulta que contém o tipo de objeto Função, o valor do argumento de tempo será o seguinte:
executeQuery:Role
atributos Todos os atributos.
rastrear Logger como ponte de rastreamento de script para o aplicativo
onde String onde condição para executar a consulta ou nula.
manipulador resultSetHandler ou SyncResultsHandler para os objetos do conector produzidos pela consulta de execução, operação de sincronização ou retorno nulo.
cotação O tipo de cotação de nome de tabela a ser usado em SQL. O valor padrão é uma string vazia. O valor desse argumento é obtido das configurações de integração.
nativeTimestamps Especifica se o script recupera os dados de timestamp das colunas como tipo java.sql.Timestamp da tabela do banco de dados. Essas informações são obtidas das configurações de integração.
allNative Especifica se o script deve recuperar o tipo de dados das colunas em um formato nativo da tabela de banco de dados. O valor desse argumento é obtido das configurações de integração. O valor deste argumento especifica se o script deve gerar exceções quando um código de erro zero (0x00) for encontrado.
enableEmptyString Especifica se o suporte para escrever uma string vazia em vez de um valor NULL deve ser ativado. O valor desse argumento é obtido das configurações de integração.
filterString Condição de filtro de string para executar consulta ou nula.
filterParams Lista de parâmetros de filtro. Cada parâmetro está presente no formato COLUMN_NAME:VALUE. Por exemplo, FIRSTNAME:test.
sincronizar atributo Nome da coluna do banco de dados configurada para reconciliação incremental. Esse argumento está disponível no script de sincronização, que é chamado durante uma execução de reconciliação incremental.
sinctoken Valor do atributo sync. Este argumento está disponível no script de sincronização.

Script de Carga de Dados de Amostra

O script de carregamento de dados lê os dados de todas as tabelas de todas as entidades definidas. Nesse cenário, o termo carregamento de dados refere-se ao carregamento de dados completo e ao carregamento de dados de consulta.

Esse script de amostra lê dados do usuário da tabela MYDBAT_PERSON e os dados de relacionamento dos usuários das tabelas MYDABAT_PERSON_ROLE e MYDBAT_PERSON_GROUP. Os dados de direitos são lidos na tabela MYDBAT_GROUPS e os dados de consulta são lidos na tabela MYDBAT_COUNTRY. Ele também tem suporte para uma pesquisa de filtro básica na tabela MYDBAT_PERSON. Todas essas leituras de dados são feitas usando procedimentos armazenados.

Script de Carga de Dados

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();
        }

Procedimento Armazenado: Carregar Usuários

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;

Procedimento Armazenado: Pesquisa de Usuário Filtrado

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;
Este é um exemplo muito básico de pesquisa de filtro com apenas uma condição de filtro, por exemplo, MYDBAT_PERSON.USERID:21. Ele é usado especificamente para o processamento writeBack após a operação de criação

Procedimento Armazenado: Obter Atribuições

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;

Procedimento Armazenado: Obter Atribuições do Usuário

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;

Procedimento Armazenado: Obter Grupos

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;

Procedimento Armazenado: Obter Grupos de Usuários

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;

Procedimento Armazenado: Obter Pesquisas (País)

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;

Script de Criação de Amostra

Este script é chamado durante o provisionamento de uma nova conta do Oracle Access Governance. Aqui estamos inserindo dados na tabela MYDBAT_PERSON.

Criar Script

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);

Script secundário de adição de amostra

Este script é chamado durante o provisionamento de direitos/permissões para usuários do Oracle Access Governance. Aqui estamos inserindo dados nas tabelas MYDBAT_PERSON_GROUP e MYDBAT_PERSON_ROLE.

Adicionar Script Filho

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();
         
};

Script filho de remoção de amostra

Este script é chamado durante o desprovisionamento de direitos/permissões de usuários do Oracle Access Governance. Aqui estamos removendo dados das tabelas MYDBAT_PERSON_GROUP e MYDBAT_PERSON_ROLE usando procedimentos armazenados.

Remover Script Filho

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();
};

Procedimento Armazenado: Remover Filho

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;

Exemplo de script de exclusão

Este script é chamado durante a revogação de uma conta do Oracle Access Governance. Aqui estamos excluindo as tabelas de relacionamento de usuário de dados, MYDBAT_PERSON_ROLE e MYDBAT_PERSON_GROUP, bem como os dados da tabela MYDBAT_PERSON

Excluir Script

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);

Script de Atualização de Amostra

Este script é chamado durante as operações de provisionamento quando a conta é atualizada do Oracle Access Governance. Aqui estamos atualizando os dados na tabela MYDBAT_PERSON

Atualizar Script

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);