Modification en masse de profils

RPG (3 et 4, free), CL, SQL, etc...
Répondre
AGL
Messages : 3
Enregistré le : ven. 15 sept. 2023, 08:33:28

Modification en masse de profils

Message par AGL »

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 !
Aurore

nbonnet
Messages : 200
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: Modification en masse de profils

Message par nbonnet »

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 :

Code : Tout sélectionner

profil1;jobd1;outq1
profil2;jobd2;outq2
profil3;jobd3;outq3
profil4;jobd4;outq4
On peut faire :

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 ;
Il suffit d'ajouter QSYS2.QCMDEXC.
On peut faire mieux !
Nathanaël

SebastienB
Messages : 51
Enregistré le : ven. 22 janv. 2021, 10:21:13

Re: Modification en masse de profils

Message par SebastienB »

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.

nbonnet
Messages : 200
Enregistré le : mar. 11 sept. 2018, 08:20:13
Localisation : Lyon

Re: Modification en masse de profils

Message par nbonnet »

Bien vu Sébastien !
Nathanaël

AGL
Messages : 3
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: Modification en masse de profils

Message par AGL »

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.

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.
2/ Je modifie le script en conséquence avec les infos données par Nathanaël (rajout du systools.split même si je n'ai qu'une colonne) :

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
ELEMENT | Actions sur jobd
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

AGL
Messages : 3
Enregistré le : ven. 15 sept. 2023, 08:33:28

Re: Modification en masse de profils

Message par AGL »

Maintenant que la solution de Nathanaël fonctionne, j'ai voulu tester la solution de Sébastien :D

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'));
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 :
Fonction_change_user_profile.JPG
Fonction_change_user_profile.JPG (87.85 Kio) Vu 333 fois
ça vous parle ?
Sinon j'utiliserai la première solution.

Merci
Aurore
Aurore

Répondre