Développer des scripts personnalisés pour les tables d'application de base de données (MSSQL) à l'aide de Groovy
Présentation des scripts personnalisés pour les tables d'application de base de données (MSSQL)
Lorsque vous provisionnez des comptes à partir d'Oracle Access Governance à l'aide de l'intégration des tables d'application de base de données, des opérations telles que la création, la mise à jour et la suppression sont mises en oeuvre à l'aide du code fourni par défaut. Dans les cas où vous souhaitez modifier les opérations fournies par défaut, vous pouvez éventuellement fournir vos propres scripts personnalisés qui mettent en œuvre vos propres exigences d'opération de provisionnement spécifiques. Cette étape est complètement facultative. Vous n'avez pas besoin de créer des scripts personnalisés si les opérations par défaut vous fournissent ce dont vous avez besoin. Vous pouvez ajouter des scripts personnalisés à toutes les opérations prises en charge. Si vous choisissez des scripts personnalisés, vous n'avez qu'à les ajouter lorsque vous avez besoin de modifier l'opération par défaut, vous pouvez avoir une combinaison de scripts personnalisés et de scripts par défaut pour les opérations prises en charge, bien que vous ne puissiez avoir qu'une seule option ou l'autre pour chaque opération spécifique. Par exemple, l'opération de création peut être mise en oeuvre à l'aide d'un script personnalisé qui ajoute certaines fonctionnalités propres à votre organisation, tandis que l'opération de suppression est inchangée et utilise la fonctionnalité par défaut.
Tout script personnalisé doit être mis en oeuvre au format Groovy. Les autres formats de script ne sont pas pris en charge.
- Créer
- Mise à jour
- Suppression
- Chargement de données
- Ajouter des données de relation
- Supprimer les données de relation
/app/<custom script> . Vous configurez l'agent en indiquant l'emplacement des scripts dans les paramètres d'intégration de votre système orchestré. Vous devez vous assurer que l'utilisateur du système d'exploitation qui exécute l'agent dispose des autorisations de lecture/écriture pour tous les scripts personnalisés.- Effectuer des mises à jour de table personnalisée
- Audit personnalisé
- Envoyer des avis personnalisés
- Utiliser la logique par défaut fournie avec le connecteur Database Application Tables
- Utiliser la logique personnalisée mise en oeuvre dans les scripts
Vous devez également noter que tous les types de script personnalisés sont pris en charge pour un système orchestré configuré pour le mode système géré. Le seul type de script pris en charge pour le mode source faisant autorité est le type de chargement de données, qui est pris en charge pour les deux modes.
Exemple de schéma de base de données
Les exemples fournis dans les sections suivantes sont basés sur les tables de base de données décrites dans cette section.
MYDBAT_PERSON
USE {dataBase};
CREATE TABLE MYDBAT_PERSON
(USERID INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
USERNAME VARCHAR(50) NOT NULL,
FIRSTNAME VARCHAR(50),
LASTNAME VARCHAR(50),
EMAIL VARCHAR(50) NOT NULL,
COUNTRYCODE VARCHAR(20),
DESCRIPTION VARCHAR(MAX),
SALARY MONEY,
JOININGDATE DATE,
STATUS VARCHAR(20) NOT NULL,
PASSWORD VARCHAR(MAX));
MYDBAT_GROUPS
USE {dataBase};
CREATE TABLE MYDBAT_GROUPS
(GROUPID VARCHAR(50) NOT NULL PRIMARY KEY,
GROUPNAME VARCHAR(50) NOT NULL);
MYDBAT_ROLES
USE {dataBase};
CREATE TABLE MYDBAT_ROLES
(ROLEID varchar(50) NOT NULL PRIMARY KEY,
ROLENAME varchar(50) NOT NULL);
MYDBAT_PERSON_GROUP
USE {dataBase};
CREATE TABLE MYDBAT_PERSON_GROUP
(USERID INT NOT NULL,
GROUPID VARCHAR(50) NOT NULL,
CONSTRAINT MYDBAT_PERSON_GROUP_PK PRIMARY KEY (USERID, GROUPID),
CONSTRAINT MYDBAT_PERSON_FK1 FOREIGN KEY (USERID)
REFERENCES MYDBAT_PERSON (USERID),
CONSTRAINT MYDBAT_GROUPS_FK1 FOREIGN KEY (GROUPID)
REFERENCES MYDBAT_GROUPS (GROUPID));
MYDBAT_PERSON_ROLE
USE {dataBase};
CREATE TABLE MYDBAT_PERSON_ROLE
(USERID INT NOT NULL,
ROLEID VARCHAR(50) NOT NULL,
FROMDATE DATE,
TODATE DATE,
CONSTRAINT MYDBAT_PERSON_ROLE_PK PRIMARY KEY (USERID, ROLEID),
CONSTRAINT MYDBAT_PERSON_FK2 FOREIGN KEY (USERID)
REFERENCES MYDBAT_PERSON (USERID),
CONSTRAINT MYDBAT_ROLES_FK1 FOREIGN KEY (ROLEID)
REFERENCES MYDBAT_ROLES (ROLEID));
MYDBAT_COUNTRY
USE {dataBase};
CREATE TABLE MYDBAT_COUNTRY
(COUNTRYCODE VARCHAR(20) NOT NULL PRIMARY KEY,
COUNTRYNAME VARCHAR(200) NOT NULL);
Une contrainte de clé primaire doit être définie pour les tables enfants telles que
mydbat_roles, mydbat_groups et mydbat_country. Si aucune clé primaire n'est définie pour les tables enfants, l'opération de validation échoue et une erreur s'affiche : La clé de la table <nom_table> n'est pas définie.Arguments de script Groovy
Les arguments suivants peuvent être utilisés dans vos scripts Groovy :
| Argument | Description |
|---|---|
| connecteur | Objet de connecteur Database Application Tables. |
| synchronisation |
Lorsque le script Groovy est appelé. L'attribut timing explique également le type d'opération en cours. Par exemple, s'il s'agit d'une opération de recherche, la classe d'objet recherchée est également retournée. Voici le format de l'argument de synchronisation pour la synchronisation des champs de consultation :
Dans ce format, OBJECT_CLASS est remplacé par le type d'objet en cours de rapprochement.Par exemple, pour une tâche programmée de synchronisation de champ de consultation qui contient le type d'objet Rôle, la valeur de l'argument de temporisation sera la suivante :
|
| attributs | Tous les attributs. |
| trace | Logger en tant que pont de trace de script vers l'application |
| où | Chaîne où la condition d'exécution de l'interrogation est nulle. |
| programme de traitement | resultSetHandler ou SyncResultsHandler pour les objets de connecteur produits par l'interrogation d'exécution, l'opération de synchronisation ou le retour nul. |
| citation | Type de guillemet de nom de table à utiliser dans SQL. La valeur par défaut est une chaîne vide. La valeur de cet argument est obtenue à partir des paramètres d'intégration. |
| nativeTimestamps | Spécifie si le script extrait les données d'horodatage des colonnes en tant que type java.sql.Timestamp de la table de base de données. Ces informations sont obtenues à partir des paramètres d'intégration. |
| allNative | Indique si le script doit extraire du tableau de base de données le type de données des colonnes dans un format natif. La valeur de cet argument est obtenue à partir des paramètres d'intégration. La valeur de cet argument spécifie si le script doit générer des exceptions lorsqu'un code d'erreur zéro (0x00) est détecté. |
| enableEmptyString | Indique si la prise en charge de l'écriture d'une chaîne vide au lieu d'une valeur NULL doit être activée. La valeur de cet argument est obtenue à partir des paramètres d'intégration. |
| filterString | Condition de filtre de chaîne pour exécuter l'interrogation, ou nulle. |
| filterParams | Liste des paramètres de filtre. Chaque paramètre est présent dans le format COLUMN_NAME:VALUE. Par exemple, FIRSTNAME:test. |
| syncattribute | Nom de la colonne de base de données configurée pour le rapprochement incrémentiel. Cet argument est disponible dans le script de synchronisation, appelé lors d'une exécution de rapprochement incrémentiel. |
| synctoken | Valeur de l'attribut de synchronisation. Cet argument est disponible dans le script de synchronisation. |
Exemple de script de chargement de données
Le script de chargement des données lit les données de toutes les tables pour toutes les entités définies. Dans ce scénario, le chargement des données du terme fait référence au chargement complet des données et au chargement des données de consultation.
Cet exemple de script lit les données d'utilisateur de la table MYDBAT_PERSON et les données de relation des utilisateurs des tables MYDABAT_PERSON_ROLE et MYDBAT_PERSON_GROUP. Les données de droits sont lues à partir de la table MYDBAT_GROUPS et les données de consultation sont lues à partir de la table MYDBAT_COUNTRY. Il prend également en charge une recherche de filtre de base sur la table MYDBAT_PERSON. Toutes ces lectures de données sont effectuées à l'aide de procédures stockées.
Script de chargement de données
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.math.*;
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 org.identityconnectors.common.security.GuardedString;
import java.text.*;
String ocName ;
var df = new SimpleDateFormat("yyyy-MM-dd");
var targetFormat = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss z");
if( timing != "") {
trace.info("[Execute Query] timing attribute value: "+ timing);
ocName = timing.split(":")[1]
}
trace.info("[Execute Query] for objectClass: "+ ocName);
switch (ocName) {
//Lookup
case "MYDBAT_COUNTRY":
CallableStatement callableStatement = null;
ResultSet resultSet = null;
try {
callableStatement = conn.prepareCall("{call GET_COUNTRIES}");
resultSet = (ResultSet) callableStatement.executeQuery();
while (resultSet.next()) {
var cob = new ConnectorObjectBuilder();
cob.setObjectClass(new ObjectClass("MYDBAT_COUNTRY"));
cob.addAttribute(AttributeBuilder.build(Uid.NAME, resultSet.getString(1)));
cob.addAttribute(AttributeBuilder.build(Name.NAME, resultSet.getString(2)));
if(!handler.handle(cob.build())) return;
}
} finally {
if(resultSet != null)
resultSet.close();
if(callableStatement != null)
callableStatement.close();
}
break;
//Entitlement
case "MYDBAT_GROUPS":
CallableStatement callableStatement = null;
ResultSet resultSet = null;
try {
callableStatement = conn.prepareCall("{call GET_GROUPS}");
resultSet = (ResultSet) callableStatement.executeQuery();
while (resultSet.next()) {
var cob = new ConnectorObjectBuilder();
cob.setObjectClass(new ObjectClass("MYDBAT_GROUPS"));
cob.addAttribute(AttributeBuilder.build(Uid.NAME, resultSet.getString(1)));
cob.addAttribute(AttributeBuilder.build(Name.NAME, resultSet.getString(2)));
if(!handler.handle(cob.build())) return;
}
} finally {
if(resultSet != null)
resultSet.close();
if(callableStatement != null)
callableStatement.close();
}
break;
//Entitlement
case "DBAT_ROLES":
CallableStatement callableStatement = null;
ResultSet resultSet = null;
try {
callableStatement = conn.prepareCall("{call GET_ROLES}");
resultSet = (ResultSet) callableStatement.executeQuery();
while (resultSet.next()) {
var cob = new ConnectorObjectBuilder();
cob.setObjectClass(new ObjectClass("MYDBAT_ROLES"));
cob.addAttribute(AttributeBuilder.build(Uid.NAME, resultSet.getString(1)));
cob.addAttribute(AttributeBuilder.build(Name.NAME, resultSet.getString(2)));
if(!handler.handle(cob.build())) return;
}
} finally {
if(resultSet != null)
resultSet.close();
if(callableStatement != null)
callableStatement.close();
}
break;
case "ACCOUNT":
case "TARGETACCOUNT":
CallableStatement parentCallableStatement = null;
ResultSet parentResultSet = null;
try {
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::Params are:: [MYDBAT_PERSON.USERID:31]
parentCallableStatement = conn.prepareCall("{call GET_PERSON_BY_USERID(?)}");
parentCallableStatement.setString(1, filterParams.get(0).split(":")[1]);
} else {
trace.info("[Execute Query] Performing Full Recon.");
parentCallableStatement = conn.prepareCall("{call GET_PERSONS}");
}
parentResultSet = (ResultSet) parentCallableStatement.executeQuery();
while (parentResultSet.next()) {
var cob = new ConnectorObjectBuilder();
cob.setObjectClass(ObjectClass.ACCOUNT);
cob.addAttribute(AttributeBuilder.build(Uid.NAME, parentResultSet.getString(1)));
cob.addAttribute(AttributeBuilder.build("FIRSTNAME", parentResultSet.getString(2)));
cob.addAttribute(AttributeBuilder.build("LASTNAME", parentResultSet.getString(3)));
cob.addAttribute(AttributeBuilder.build("EMAIL", parentResultSet.getString(4)));
cob.addAttribute(AttributeBuilder.build("DESCRIPTION", parentResultSet.getString(5)));
cob.addAttribute(AttributeBuilder.build("SALARY", parentResultSet.getDouble(6)));
var joiningDbDate = parentResultSet.getDate(7);
if( joiningDbDate != null ) {
var date = df.parse(joiningDbDate.toString());
var joinDateStr = targetFormat.format(date);
var joinDate = date.getTime();
trace.info("date : "+ date +" ---- joinDate : "+ joinDate);
trace.info("Setting joinDate: "+ joinDate);
cob.addAttribute(AttributeBuilder.build("JOININGDATE", joinDate));
}
cob.addAttribute(AttributeBuilder.build(OperationalAttributes.ENABLE_NAME, "ACTIVE".equalsIgnoreCase(parentResultSet.getString(8))));
cob.addAttribute(AttributeBuilder.build("COUNTRYCODE", parentResultSet.getString(9)));
cob.addAttribute(AttributeBuilder.build(Name.NAME, parentResultSet.getString(10)));
if (ocName.equals("TARGETACCOUNT")) {
CallableStatement callableStatement = null;
ResultSet resultSet = null;
try {
//Person role
callableStatement = conn.prepareCall("{call GET_PERSON_ROLE(?)}");
callableStatement.setString(1, parentResultSet.getString(1));
resultSet = (ResultSet) callableStatement.executeQuery();
var eoList = new ArrayList<EmbeddedObject>();
while (resultSet.next()) {
var roleEA = new EmbeddedObjectBuilder();
roleEA.setObjectClass(new ObjectClass("MYDBAT_ROLES"));
roleEA.addAttribute(AttributeBuilder.build("ROLEID", resultSet.getString(2)));
var fromDbDate = resultSet.getDate(3);
if( fromDbDate != null ) {
var date = df.parse(fromDbDate.toString());
var fromDateStr = targetFormat.format(date);
var fromDate = date.getTime();
trace.info("Setting roles fromDate : "+ fromDate);
roleEA.addAttribute(AttributeBuilder.build("FROMDATE", fromDate));
}
var toDbDate = resultSet.getDate(4);
if( toDbDate != null ) {
var date = df.parse(toDbDate.toString());
var toDateStr = targetFormat.format(date);
var toDate = date.getTime();
trace.info("Setting roles toDate: "+ toDate);
roleEA.addAttribute(AttributeBuilder.build("TODATE", toDate));
}
eoList.add(roleEA.build());
}
var roleEm = eoList.toArray(new EmbeddedObject[eoList.size()]);
cob.addAttribute(AttributeBuilder.build("MYDBAT_PERSON_ROLE", (Object[]) roleEm));
} finally {
if(resultSet != null)
resultSet.close();
if(callableStatement != null)
callableStatement.close();
}
try {
//Person group
callableStatement = conn.prepareCall("{call GET_PERSON_GROUP(?)}");
callableStatement.setString(1, parentResultSet.getString(1));
resultSet = (ResultSet) callableStatement.executeQuery();
var geoList = new ArrayList<EmbeddedObject>();
while (resultSet.next()) {
var groupEA = new EmbeddedObjectBuilder();
groupEA.setObjectClass(new ObjectClass("MYDBAT_GROUPS"));
groupEA.addAttribute(AttributeBuilder.build("GROUPID", resultSet.getString(2)));
geoList.add(groupEA.build());
}
var groupEm = geoList.toArray(new EmbeddedObject[geoList.size()]);
cob.addAttribute(AttributeBuilder.build("DBAT_PERSON_GROUP", (Object[]) groupEm));
} finally {
if( resultSet != null )
resultSet.close();
if( callableStatement != null )
callableStatement.close();
}
}
if(!handler.handle(cob.build())) return;
}
} finally {
if( parentResultSet != null )
parentResultSet.close();
if( parentCallableStatement != null )
parentCallableStatement.close();
}
break;
}
Procédure stockée : Charger les utilisateurs
USE {dataBase};
CREATE OR ALTER PROCEDURE GET_PERSONS
AS
BEGIN
SELECT USERID,
FIRSTNAME,
LASTNAME,
EMAIL,
DESCRIPTION,
SALARY,
JOININGDATE,
STATUS,
COUNTRYCODE,
USERNAME
FROM MYDBAT_PERSON
END;
Procédure stockée : Recherche d'utilisateur filtrée
USE {dataBase};
CREATE OR ALTER PROCEDURE GET_PERSON_BY_USERID
@user_id INT
AS
BEGIN
SELECT USERID,
FIRSTNAME,
LASTNAME,
EMAIL,
DESCRIPTION,
SALARY,
JOININGDATE,
STATUS,
COUNTRYCODE,
USERNAME
FROM MYDBAT_PERSON
WHERE USERID = @user_id;
END;Il s'agit d'un exemple très basique de recherche de filtre avec une seule condition de filtre, par exemple MYDBAT_PERSON.USERID :21. Utilisé spécifiquement pour le traitement writeBack après l'opération de créationProcédure stockée : Obtenir les rôles
USE {dataBase};
CREATE OR ALTER PROCEDURE GET_ROLES
AS
BEGIN
SELECT ROLEID,
ROLENAME
FROM MYDBAT_ROLES;
END;
Procédure stockée : Obtenir les rôles d'utilisateur
USE {dataBase};
CREATE OR ALTER PROCEDURE GET_PERSON_ROLE
@user_id INT
AS
BEGIN
SELECT USERID,
ROLEID,
FROMDATE,
TODATE
FROM MYDBAT_PERSON_ROLE WHERE USERID = @user_id
END;
Procédure stockée : Obtenir des groupes
USE {dataBase};
CREATE OR ALTER PROCEDURE GET_GROUPS
AS
BEGIN
SELECT GROUPID,
GROUPNAME
FROM MYDBAT_GROUPS;
END;
Procédure stockée : Obtenir les groupes d'utilisateurs
USE {dataBase};
CREATE OR ALTER PROCEDURE GET_PERSON_GROUP
@user_id INT
AS
BEGIN
SELECT USERID,
GROUPID
FROM MYDBAT_PERSON_GROUP where USERID = @user_id;
END;
Procédure stockée : Obtenir les consultations (pays)
use {dataBase};
CREATE OR ALTER PROCEDURE GET_COUNTRIES
AS
BEGIN
SELECT COUNTRYCODE,
COUNTRYNAME
FROM MYDBAT_COUNTRY;
END;
Exemple de script de création
Ce script est appelé lors du provisionnement d'un nouveau compte à partir d'Oracle Access Governance. Ici, nous insérons des données dans la table MYDBAT_PERSON.
Script de création
import java.sql.CallableStatement;
import java.sql.Types;
import java.util.Date.*;
import org.identityconnectors.common.security.GuardedString;
import org.identityconnectors.framework.common.objects.*;
import java.text.*;
CallableStatement callableStatement = null;
String uid = null;
try {
trace.info("[Create-Groovy] Attributes:: " + attributes);
callableStatement = conn.prepareCall("{call ADD_PERSON(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)}");
callableStatement.setString(1, attributes.get(Name.NAME) != null ? attributes.get(Name.NAME).getValue().get(0) : null);
callableStatement.setString(2, attributes.get("FIRSTNAME") != null ? attributes.get("FIRSTNAME").getValue().get(0) : null);
callableStatement.setString(3, attributes.get("LASTNAME") != null ? attributes.get("LASTNAME").getValue().get(0) : null);
callableStatement.setString(4, attributes.get("EMAIL") != null ? attributes.get("EMAIL").getValue().get(0) : null);
callableStatement.setString(5, attributes.get("COUNTRYCODE") != null ? attributes.get("COUNTRYCODE").getValue().get(0) : null);
callableStatement.setString(6, attributes.get("DESCRIPTION") != null ? attributes.get("DESCRIPTION").getValue().get(0) : null);
callableStatement.setString(7, (attributes.get(OperationalAttributes.ENABLE_NAME) != null ? attributes.get(OperationalAttributes.ENABLE_NAME).getValue().get(0) : true) ? "ACTIVE" : "INACTIVE");
var joiningdate = attributes.get("JOININGDATE") != null ? attributes.get("JOININGDATE").getValue().get(0) : null;
callableStatement.setString(8, (joiningdate != null && joiningdate != 0) ? new SimpleDateFormat("yyyy-MM-dd").format(new Date(joiningdate)) : null);
var salary = attributes.get("SALARY") != null ? attributes.get("SALARY").getValue().get(0) : null;
if(salary != null)
callableStatement.setDouble(9, salary);
else
callableStatement.setNull(9, Types.DOUBLE)
var password = attributes.get(OperationalAttributes.PASSWORD_NAME) != null ? attributes.get(OperationalAttributes.PASSWORD_NAME).getValue().get(0) : null;
if (password != null) {
password.access(new GuardedString.Accessor() {
public void access(char[] clearChars) { callableStatement.setString(10, new String(clearChars));}
});
} else
callableStatement.setString(10, null);
callableStatement.registerOutParameter(11, Types.NVARCHAR);
callableStatement.execute();
uid = callableStatement.getString(11);
} finally {
if (callableStatement != null)
callableStatement.close();
}
trace.info("[Create] Created User:: " +uid);
return new Uid(uid);
Exemple de script d'ajout enfant
Ce script est appelé lors du provisionnement des droits/autorisations aux utilisateurs à partir d'Oracle Access Governance. Ici, nous insérons des données dans les tables MYDBAT_PERSON_GROUP et MYDBAT_PERSON_ROLE.
Ajouter un script enfant
import java.sql.PreparedStatement;
import org.identityconnectors.framework.common.objects.*;
import java.text.*;
trace.info("[addMultiValuedAttributeScript-Groovy] Adding Child data:: " + attributes);
String userId = attributes.get(Uid.NAME).getValue().get(0);
PreparedStatement childst = null;
Attribute dbatChild = null;
try {
dbatChild = attributes.get("MYDBAT_PERSON_GROUP");
if (dbatChild != null) {
var childDataEOSet = dbatChild.getValue();
childst = conn.prepareStatement("INSERT INTO MYDBAT_PERSON_GROUP VALUES (?, ?)");
if (childDataEOSet != null) {
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) {
childst.setString(1, userId);
childst.setString(2, grpAttr.getValue().get(0));
childst.executeUpdate();
childst.clearParameters();
}
};
}
}
} finally {
if (childst != null)
childst.close();
};
try {
dbatChild = attributes.get("MYDBAT_PERSON_ROLE");
if (dbatChild != null) {
var childDataEOSet = dbatChild.getValue();
childst = conn.prepareStatement("INSERT INTO MYDBAT_PERSON_ROLE VALUES (?, ?, ?, ?)");
if (childDataEOSet != null) {
trace.info("[addMultiValuedAttributeScript] Adding Role data.");
for ( iterator = childDataEOSet.iterator(); iterator.hasNext(); ) {
eo = iterator.next();
attrsSet = eo.getAttributes();
roleattr = AttributeUtil.find("ROLEID", attrsSet);
if (roleattr != null) {
childst.setString(1, userId);
childst.setString(2, roleattr.getValue().get(0));
childst.setString(3, AttributeUtil.find("FROMDATE", attrsSet) != null ? new SimpleDateFormat("yyyy-MM-dd").format(new Date(AttributeUtil.find("FROMDATE", attrsSet).getValue().get(0))) : null);
childst.setString(4, AttributeUtil.find("TODATE", attrsSet) != null ? new SimpleDateFormat("yyyy-MM-dd").format(new Date(AttributeUtil.find("TODATE", attrsSet).getValue().get(0))) : null);
childst.executeUpdate();
childst.clearParameters();
}
};
}
}
} finally {
if (childst != null)
childst.close();
};
Exemple de suppression de script enfant
Ce script est appelé lors du déprovisionnement des droits/autorisations des utilisateurs à partir d'Oracle Access Governance. Ici, nous supprimons les données des tables MYDBAT_PERSON_GROUP et MYDBAT_PERSON_ROLE à l'aide de procédures stockées.
Supprimer le script enfant
import java.sql.CallableStatement;
import org.identityconnectors.framework.common.objects.*;
trace.info("[removeMultiValuedAttributeScript] Removing Child data:: "+ attributes);
var uid = attributes.get(Uid.NAME).getValue().get(0);
CallableStatement callableStatement = null;
Attribute dbatChild = null;
try {
dbatChild = attributes.get("MYDBAT_PERSON_GROUP");
if (dbatChild != null) {
var childDataEOSet = dbatChild.getValue();
//Delete child data using stored procedure
callableStatement = conn.prepareCall("{call DELETE_PERSON_GROUP(?, ?)}");
if(childDataEOSet != null) {
trace.info("[removeMultiValuedAttributeScript] Removing Group data.");
//Iterate through child data and delete
for( iterator = childDataEOSet.iterator(); iterator.hasNext(); ) {
eo = iterator.next();
grpattr = AttributeUtil.find("GROUPID", eo.getAttributes());
if (grpattr != null) {
callableStatement.setString(1, uid);
callableStatement.setString(2, grpattr.getValue().get(0));
callableStatement.executeUpdate();
trace.info("[removeMultiValuedAttributeScript] Deleted Group:: "+ grpattr);
}
};
}
}
} finally {
if (callableStatement != null)
callableStatement.close();
};
try {
dbatChild = attributes.get("MYDBAT_PERSON_ROLE");
if (dbatChild != null) {
var childDataEOSet = dbatChild.getValue();
callableStatement = conn.prepareCall("{call DELETE_PERSON_ROLE(?, ?)}");
if(childDataEOSet != null) {
trace.info("[removeMultiValuedAttributeScript] Removing Role data.");
for ( iterator = childDataEOSet.iterator(); iterator.hasNext(); ) {
eo = iterator.next();
roleattr = AttributeUtil.find("ROLEID", eo.getAttributes());
if(roleattr != null) {
callableStatement.setString(1, uid);
callableStatement.setString(2, roleattr.getValue().get(0));
callableStatement.executeUpdate();
trace.info("[removeMultiValuedAttributeScript] Deleted Role:: "+ roleattr);
}
};
}
}
} finally {
if (callableStatement != null)
callableStatement.close();
};
Procédure stockée : Supprimer l'enfant
USE {dataBase};
CREATE OR ALTER PROCEDURE DELETE_PERSON_GROUP
@user_id INT, @group_id nvarchar(50)
AS
BEGIN
DELETE from MYDBAT_PERSON_GROUP where USERID = @user_id AND GROUPID = @group_id
END;
USE {dataBase};
CREATE OR ALTER PROCEDURE DELETE_PERSON_ROLE
@user_id INT, @role_id nvarchar(50)
AS
BEGIN
DELETE FROM MYDBAT_PERSON_ROLE where USERID = @user_id AND ROLEID = @role_id
END;
Exemple de script de suppression
Ce script est appelé lors de la révocation d'un compte d'Oracle Access Governance. Ici, nous supprimons les tables de relation d'utilisateur de données, MYDBAT_PERSON_ROLE et MYDBAT_PERSON_GROUP, ainsi que les données de la table MYDBAT_PERSON
Supprimer le script
import java.sql.CallableStatement;
import org.identityconnectors.framework.common.objects.*;
var uid = attributes.get(Uid.NAME).getValue().get(0);
CallableStatement callableStatement = null;
try {
trace.info("[Delete-Groovy] Deleting user:: " + uid);
callableStatement = conn.prepareCall("{call DELETE_PERSON(?)}");
callableStatement.setString(1, uid);
callableStatement.execute();
} finally {
if (callableStatement != null)
callableStatement.close();
};
trace.info("Deleted user:: " + uid);
Procédure stockée : Supprimer
USE {dataBase};
CREATE OR ALTER PROCEDURE DELETE_PERSON
@user_id INT
AS
BEGIN
DELETE FROM MYDBAT_PERSON_ROLE where USERID = @user_id;
DELETE FROM MYDBAT_PERSON_GROUP where USERID = @user_id;
DELETE FROM MYDBAT_PERSON WHERE USERID = @user_id;
END;
Exemple de script de mise à jour
Ce script est appelé lors des opérations de provisionnement lorsque le compte est mis à jour à partir d'Oracle Access Governance. Ici, nous mettons à jour les données dans le tableau MYDBAT_PERSON
Script de mise à jour
import java.sql.PreparedStatement;
import java.sql.Types;
import org.identityconnectors.framework.common.objects.*;
import java.text.*;
import org.identityconnectors.framework.common.exceptions.*;
import org.identityconnectors.common.security.GuardedString;
trace.info("[Update-Groovy] Atrributes:: " + attributes);
PreparedStatement stmt = null;
String userId = null;
try {
userId = attributes.get(Uid.NAME) != null ? attributes.get(Uid.NAME).getValue().get(0) : null;
if (userId == null)
throw new ConnectorException("UID Cannot be Null");
stmt = conn.prepareStatement("UPDATE MYDBAT_PERSON SET FIRSTNAME = COALESCE(?, FIRSTNAME), LASTNAME = COALESCE(?, LASTNAME), EMAIL = COALESCE(?, EMAIL), COUNTRYCODE = COALESCE(?, COUNTRYCODE), DESCRIPTION = COALESCE(?, DESCRIPTION), STATUS = COALESCE(?, STATUS), JOININGDATE = COALESCE(?, JOININGDATE), SALARY = COALESCE(?, SALARY), PASSWORD = COALESCE(?, PASSWORD) WHERE USERID = ?");
stmt.setString(1, attributes.get("FIRSTNAME") != null ? attributes.get("FIRSTNAME").getValue().get(0) : null);
stmt.setString(2, attributes.get("LASTNAME") != null ? attributes.get("LASTNAME").getValue().get(0) : null);
stmt.setString(3, attributes.get("EMAIL") != null ? attributes.get("EMAIL").getValue().get(0) : null);
stmt.setString(4, attributes.get("COUNTRYCODE") != null ? attributes.get("COUNTRYCODE").getValue().get(0) : null);
stmt.setString(5, attributes.get("DESCRIPTION") != null ? attributes.get("DESCRIPTION").getValue().get(0) : null);
stmt.setString(6, (attributes.get(OperationalAttributes.ENABLE_NAME) != null ? attributes.get(OperationalAttributes.ENABLE_NAME).getValue().get(0) : true) ? "ACTIVE" : "INACTIVE");
var joiningdate = attributes.get("JOININGDATE") != null ? attributes.get("JOININGDATE").getValue().get(0) : null;
stmt.setString(7, joiningdate != null ? new SimpleDateFormat("yyyy-MM-dd").format(new Date(joiningdate)) : null)
var salary = attributes.get("SALARY") != null ? attributes.get("SALARY").getValue().get(0) : null;
if(salary != null)
stmt.setDouble(8, salary);
else
stmt.setNull(8, Types.DOUBLE)
var password = attributes.get(OperationalAttributes.PASSWORD_NAME) != null ? attributes.get(OperationalAttributes.PASSWORD_NAME).getValue().get(0) : null;
if (password != null) {
password.access(new GuardedString.Accessor() {
public void access(char[] clearChars) { stmt.setString(9, new String(clearChars));}
});
} else
stmt.setString(9, null);
stmt.setString(10, userId);
stmt.executeUpdate();
} finally {
if (stmt != null)
stmt.close();
};
trace.info("[Update] Updated user:: " + userId);
return new Uid(userId);