Bonjour,
Je suis à la recherche d'un script SQL qui modifie des profils en masse.
J'aimerai pouvoir modifier l'attribut jobd et outq d'une liste de profil.
J'aimerai utiliser la fonction IFS_READ qui me permet de lire un fichier déposé sur l'IFS avec la liste des profils que je souhaite modifier.
Ces profils auront tous la même jobd et la même outq.
je comptais exécuter dans mon script SQL la commande suivante :
QSYS2.QCMDEXC('CHGUSRPRF USRPRF('|| A.AUTHORIZATION_NAME||') JOBD(nomdelajob) OUTQ(nomdemonoutq)')
dans une boucle qui lit mon fichier sur l'IFS en exécutant la comamnde
QSYS2.IFS_READ_UTF8(PATH_NAME => '/home/mondossier/listeusr.csv')
Côté SQL je suis assez novice, je récupère des scripts existants que j'apprivoise.
Si je souhaite réutiliser ce programme, j'imagine que je pourrai faire une procédure stockée que j'appelerai avec les valeurs jobd, outq et chemin du fichier contenant la liste des utilisateurs sur l'iFS mais je n'ai pas forcément la technique.
Quelqu'un l'aurait-il déjà développé ?
Merci !
[Résolu]Modification en masse de profils
[Résolu]Modification en masse de profils
Modifié en dernier par AGL le ven. 30 août 2024, 12:51:59, modifié 2 fois.
Aurore
Re: Modification en masse de profils
Bonjour,
La démarche est la bonne.
On peut effectivement faire cela avec une bonne requête SQL (je n'ai pas développé particulièrement).
Par exemple :
QSYS2.IFS_READ_UTF8 : permet de lire le csv
SYSTOOLS.SPLIT : permet de découper le CSV
après il faut remettre tout cela en ordre
Par exemple pour un csv de ce style stocké ici /home/NB/profil.csv :
On peut faire :
Il suffit d'ajouter QSYS2.QCMDEXC.
On peut faire mieux !
La démarche est la bonne.
On peut effectivement faire cela avec une bonne requête SQL (je n'ai pas développé particulièrement).
Par exemple :
QSYS2.IFS_READ_UTF8 : permet de lire le csv
SYSTOOLS.SPLIT : permet de découper le CSV
après il faut remettre tout cela en ordre
Par exemple pour un csv de ce style stocké ici /home/NB/profil.csv :
Code : Tout sélectionner
profil1;jobd1;outq1
profil2;jobd2;outq2
profil3;jobd3;outq3
profil4;jobd4;outq4
Code : Tout sélectionner
with w as (SELECT * FROM TABLE(QSYS2.IFS_READ_UTF8('/home/NB/profil.csv')) t,
lateral (select * from table(systools.split(t.line, ';')) ))
select 'CHGUSRPRF USRPRF('|| trim(p.element) ||') JOBD('|| trim(j.element) ||') OUTQ('|| trim(o.element) ||')'
from w as p
join w as j on p.line_number = j.line_number
join w as o on p.line_number = o.line_number
where p.ordinal_position = 1 and
j.ordinal_position = 2 and
o.ordinal_position = 3 ;
On peut faire mieux !
Nathanaël
-
- Messages : 55
- Enregistré le : ven. 22 janv. 2021, 10:21:13
Re: Modification en masse de profils
Bonjour,
selon la version de votre IBMi, il existe aussi la fonction table CHANGE_USER_PROFILE:
https://www.ibm.com/docs/en/i/7.4?topic ... e-function
Couplé à ce que propose Nathanaël, cela devrait faire le job.
selon la version de votre IBMi, il existe aussi la fonction table CHANGE_USER_PROFILE:
https://www.ibm.com/docs/en/i/7.4?topic ... e-function
Couplé à ce que propose Nathanaël, cela devrait faire le job.
Re: Modification en masse de profils
Bonjour,
Tout d'abord, merci pour vos retours rapide !
en fait hier soir j'ai voulu faire quelques tests avec la solution de Nathanaël mais je vais jeter un oeil dans la matinée sur la fonction CHANGE_USER_PROFILE (je suis en 7.4 TR9 donc ça doit être bon).
Voici mes tests :
A savoir que mon csv ne contient qu'une seule colonne (le nom du profil)
1/ Script qui me renvoie si mon changement s'est bien passé avec le nom du profil récupéré dans le csv.
TEST32 | KO - jobd et outq non modifiés
TEST31 | OK - jobd et outq modifié
Le profil TEST 31 est bien modifié mais pas le TEST32
Mais je vois ces caractères devant qui semble poser problème. J'ai quelque chose à modifier d'après vous ?
[Modification]
Après discussion avec un collègue... Oui c'était l'histoire d'encodage de mon CSV qui était en UTF-8-BOM et que nous avons passé en UTF-8
Ca fonctionne donc !
Merci
Aurore
Tout d'abord, merci pour vos retours rapide !
en fait hier soir j'ai voulu faire quelques tests avec la solution de Nathanaël mais je vais jeter un oeil dans la matinée sur la fonction CHANGE_USER_PROFILE (je suis en 7.4 TR9 donc ça doit être bon).
Voici mes tests :
A savoir que mon csv ne contient qu'une seule colonne (le nom du profil)
1/ Script qui me renvoie si mon changement s'est bien passé avec le nom du profil récupéré dans le csv.
Code : Tout sélectionner
WITH w AS (SELECT * FROM TABLE(QSYS2.IFS_READ_UTF8('/home/AGL/listetest.csv')) t)
SELECT p.element,
CASE
WHEN QSYS2.QCMDEXC('CHGUSRPRF USRPRF('|| trim(p.element) ||') JOBD(LIBGEN/TEST) OUTQ(LIBGEN/TEST)') = 1 THEN 'OK - jobd et outq modifiés'
ELSE 'KO - jobd et outq non modifiés'
END AS "Actions sur jobd"
FROM w as p;
- Problème rencontré : La colonne ELEMENT ne se trouve pas dans la table W de *N. Cause . . . . . : La colonne portant le nom ELEMENT ne se trouve pas dans la table ou la vue W du schéma *N.
Code : Tout sélectionner
WITH w AS (SELECT * FROM TABLE(QSYS2.IFS_READ_UTF8('/home/AGL/listetest.csv')) t,
lateral (select * from table(systools.split(t.line, ';')) ))
SELECT p.element,
CASE
WHEN QSYS2.QCMDEXC('CHGUSRPRF USRPRF('|| trim(p.element) ||') JOBD(LIBGEN/TEST) OUTQ(LIBGEN/TEST)') = 1 THEN 'OK - jobd et outq modifiés'
ELSE 'KO - jobd et outq non modifiés'
END AS "Actions sur jobd"
FROM w as p;
- Problème rencontré : ça fonctionne .. mais bizarrement j'ai un résultat de ce type
TEST32 | KO - jobd et outq non modifiés
TEST31 | OK - jobd et outq modifié
Le profil TEST 31 est bien modifié mais pas le TEST32
Mais je vois ces caractères devant qui semble poser problème. J'ai quelque chose à modifier d'après vous ?
[Modification]
Après discussion avec un collègue... Oui c'était l'histoire d'encodage de mon CSV qui était en UTF-8-BOM et que nous avons passé en UTF-8
Ca fonctionne donc !
Merci
Aurore
Aurore
Re: Modification en masse de profils
Maintenant que la solution de Nathanaël fonctionne, j'ai voulu tester la solution de Sébastien
En fait ça fonctionne avec ce script mais il me manque le changement de l'outq :
Quand je regarde la documentation de la fonction https://www.ibm.com/docs/en/i/7.4?topic ... e-function, je ne vois pas l'attribut permettant de modifier l'outq et en vérifiant la fonction sur ma partition, je ne le vois pas non plus :
ça vous parle ?
Sinon j'utiliserai la première solution.
Merci
Aurore
En fait ça fonctionne avec ce script mais il me manque le changement de l'outq :
Code : Tout sélectionner
WITH w AS (SELECT * FROM TABLE(QSYS2.IFS_READ_UTF8('/home/AGL/listetest.csv')) t,
lateral (select * from table(systools.split(t.line, ';')) ))
SELECT p.element FROM w as p, TABLE(SYSTOOLS.CHANGE_USER_PROFILE (
P_USER_NAME => p.element,
P_JOB_DESCRIPTION => 'LIBGEN/TEST',
PREVIEW => 'NO'));
Sinon j'utiliserai la première solution.
Merci
Aurore
Aurore