pause-café
destinée aux informaticiens sur plateforme IBM i.
Pause-café #68
V7R20
-
OS, Installation
- une partition 6.11 ou 7.1 (ce fut notre cas pour les premiers tests) peut héberger une partition 7.2 hostée.
Quelques remarques
- si vous faites une installation automatique (IPL/D en mode normal), il faut impérativement au préalable :
• lancer l'API QINSTLNG en lui passant comme paramètre '2928'
- si vous faites l'installation manuelle (IPL/D, manuel), vous devrez choisir la langue
L'installation se poursuit:
Temps de migration (7.1 vers 7.2) constatés :
- restauration du microcode : 10 minutes
- Installation de l'OS : 20 minutes
- Logiciels sous licence : 50 Minutes
- Installation des PTF à Juillet 2014 : 35 minutes
- bref autours de 2h30 avec les divers temps de latence, sur une machine peu chargée
- ATTENTION : vous devez impérativement avoir comme disque d'IPL, un disque de 70 Go au moins, sinon vous verrez l'erreur suivante:
- une partition 6.11 ou 7.1 (ce fut notre cas pour les premiers tests) peut héberger une partition 7.2 hostée.
Différences entre la version 7.1 et la 7.2
- IBM i
- la notion de version dans les API systèmes est traditionnellement notée VvRrMm
Pour les produits ayant besoin de valeurs supérieures à 9, elles seront désormais acceptées vvrrmm
(par exemple 011404 pour un produit en V1R14M0)
Cela a un impact sur toutes les APi de gestion de produit
- QLPACAGR,QLPLPRDS,QLPRAGR,QSZSPTPR,QSZCRTPD,QSZCRTPL,QSZMPRLS,QSZPKGPO
QSZRTVPR,QSZSLTPR,QLZAADDK,QLZADDLI,QLZAGENK,QLZARLS,QLZAREQ,QLZARTV et QLZARTVK
- QLPACAGR,QLPLPRDS,QLPRAGR,QSZSPTPR,QSZCRTPD,QSZCRTPL,QSZMPRLS,QSZPKGPO
et de PTF- QPZCPYSV, QPZCRTFX, QpzCreatePtfGroup, QPZGENNM, QPZLOGFX, QpzListPTF, QpzListPtfGroupDetails, QPZRTVFX
- ainsi que les programmes sur les points d'exit PTF
Cela impact aussi le résultat de la commande DSPOBJD
- La taille mémoire maxi associée à un profil a été agrandie, vous pouvez donc utiliser MAXSTG (11,0) ou MAXSTGLRG (20,0)
mais pas les deux.
La commande RTVUSRPRF possède ces deux paramètres
Si vous recevez -2 dans MAXSTG, il fallait impérativement utiliser MAXSTGLRG
L'API QSYUSRI a été modifiée dans le même sens.
- les commandes CRTCLS et CHGCLS renseignent le paramètre MAXTMPSTG en Mo et non plus en Ko
Cela n'a pas d'impact sur les classes existantes, mais sur tous les CL qui manipulent ces commandes !
- STRPCCMD admet désormais un paramètre de 1023 caractères (avant c'était 123)
- Le résultat de WRKACTJOB *PRINT, dépasse 132 c. à ce niveau de version !
- Lors de l'applications de PTF les objets supprimés ne seront plus placés dans QRPLOBJ mais dans QPTFOBJ1 et QPTFOBJ2
- la commande SAVSTG disparaît !
- la notion de version dans les API systèmes est traditionnellement notée VvRrMm
- DB2 for i
- SQE est utilisé y compris pour QUERY, OPNQRYF , OPNDBF
pareil pour les I/O natives sur les vues et enfin pour toute utilisation de fichiers avec des droits RCAC
ce site http://powerwire.eu/exclusive-ibm-i-7-2-delivers-17x-performance-gain-with-zero-change
indique qu'il a constaté des gains de l'ordre de 17 fois supérieur.
résumé des différences engendrées :
- Le tri par défaut (quand vous n'en indiquez pas) peut changer pour RUNRY et OPNQRYF
- les valeurs pour les zones dérivées (d'une expression, par ex SUBSTR) qui sont nulles ou en erreur changent
- avec CQE, la colonne prenait la valeur par défaut et l'indicateur de nullité était positionné à ON
- avec SQE, seule l'indicateur de nullité est positionné, la valeur par défaut n'est pas garantie
De toutes façons, la seule bonne pratique est de tester la nullité avant de tester la valeur de la variable !
- Le tri par défaut (quand vous n'en indiquez pas) peut changer pour RUNRY et OPNQRYF
- Il existe une nouvelle option dans QAQQINI SQE_NATIVE_ACCESS
- *YES : le moteur SQE est privilégié et on utilise CQE que dans les cas suivants :
- Accès à travers l'API QQQQRY
- Utilisation de DB2 for i Multisystem
- Accès à un fichier avec un trigger à la lecture
- Query sur un fichier en interne (IDDU)
- Accès à un fichier utilisant une séquence de tri ICU 2.6 (avant la 7.1)
depuis la 7.1 les tables ICU 3.4 sont nommées I34xxx dans QSYS
- Accès à un fichier avec des membres et un OVRDBF MBR(*ALL) en cours.
- Requêtes utilisant plus de 1000 membres !
- Accès à travers l'API QQQQRY
- *NO : CQE est privilégié, SQE n'est utilisé que quand c'est le seul moyen de réaliser la requête (RCAC par ex.)
- *YES : le moteur SQE est privilégié et on utilise CQE que dans les cas suivants :
- CURRENT_USER est devenu un mot réservé, vérifiez que vous n'avez pas de colonnes qui s'appellent comme ca.
SELECT * FROM QSYS2.SYSCOLUMNS
WHERE
COLUMN_NAME = 'CURRENT_USER' AND TABLE_OWNER <> 'QSYS'
si c'est le cas vous devrez placer ce nom entre " et " ("CURRENT_USER").- le registre CURRENT_SCHEMA retourne le nom de la bibliothèque sans guillemets, même dans le cas de nom long ou complexe
Exemple avec le schéma "nom-de-bib-vraiment-long"
Affiche ->
La fonction DELIMIT_NAME (7.1 avec SF99701 level 29) affiche comme en 7.1
- les noms dans OBJECT_SCHEMA et OBJECT_NAME de QSYS2.SYSROUTINEDEP
sont désormais aussi stockés sans les guillemets.
- Le code SQL d'un procédure stockée ou d'une fonction peut être masqué (procédure sysibmadm.wrap présente en 7.1 via PTF)
-> PRTSQLINF ne retourne alors aucune donnée.
- Si vous avez des tables avec des champs AS IDENTITY (auto-incrémentés) avec GENERATED ALWAYS
- cette colonne ne peut pas être renseignée dans un ordre INSERT, ca ne change pas.
- en 7.1 dans un ordre UPDATE incluant cette zone avec OVERRIDING USER VALUE, la valeur n'était pas modifiée
- en 7.2 , toujours avec OVERRIDING USER VALUE, la colonne sera désormais modifiée avec une nouvelle valeur générée automatiquement !
Exemple, soit la table suivante
Contenant deux lignes
La mise à jour suivante
Génère
Ceci n'est pas vrai pour un Update RPG natif, ce dernier n'ayant pas la clause OVERRIDING USER VALUE
- cette colonne ne peut pas être renseignée dans un ordre INSERT, ca ne change pas.
- la fonction POSITION utilisée avec "," inverse les paramètres reçus pour être conforme aux autres implémentations de DB2
POSITION(recherche, source)
en version 6 et 7, il fallait saisir :
POSITION(source, recherche)
la forme utilisant IN à la place de ',' ne change pas :
POSITION(recherche IN source)
Pour éviter ce nouveau comportement vous pouvez créer la variable d'environnement QIBM_SQL_POSITION_LIKE_DB2 et placer 'N'
ADDENVVAR ENVVAR(QIBM_SQL_POSITION_LIKE_DB2) VALUE('N') LEVEL(*SYS)
- EN 7.1 la restauration d'un logique sur un fichier existant, avec un niveau de format différent, échouait
EN 7.2 avec ALWOBJDIF(*COMPATIBLE) la restauration à lieu, sans message.
- Enfin, la documentation précise que les conditions d'accès à DB2 via CLI changent
- Si un utilisateur est précisé pour un accès SQL (base autre que *LOCAL) , le mot de passe doit aussi être indiqué
- Si un utilisateur est précisé pour un accès à *LOCAL, ca doit être l'utilisateur en cours, sinon vous recevrez SQL0722
- Enfin si aucun utilisateur n'est indiqué pour un accès avec l'utilisateur en cours, Utilisateur et mot de passe doivent être transmis à NULL (et non à blanc)
Cette nouveauté trouble le fonctionnement de :
- PHP
- les accès locaux avec DB2_connect peuvent toujours se faire sans profil/mot de passe
- les accès odbc_connect doivent indiquer profil/mot de passe (c'était déjà compliqué depuis Zend server6)
- NetData
- A ce jour, les accès NetData ne fonctionnent plus, sauf
- A basculer le CGI sous un profil significatif, et
- A indiquer dans la macro :
%DEFINE{
DATABASE="*LOCAL
LOGIN="LEPROFIL"
PASSWORD="motdepasse"
%}
- A ce jour, les accès NetData ne fonctionnent plus, sauf
- Si un utilisateur est précisé pour un accès SQL (base autre que *LOCAL) , le mot de passe doit aussi être indiqué
- SQE est utilisé y compris pour QUERY, OPNQRYF , OPNDBF
- Options de 5770SS1 et autres logiciels
- System Openess Include
Toutes les déclarations de zone binaires sont passées de 4B 0 en 5I 0
Cela peut gêner la compilation de sources "maison" utilisant l'ancien type
- l'option 31 de SS1 (serveur DNS) utilise OpenSSH, OpenSSL, and zlib, 5733SC1/option 1 doit donc être installé
- 5770JV1
les versions de Java 1.4.2 (option 13) et 5.0 (options 8 and 9) ne sont plus supportées
les commandes ANZJVAPGM, ANZJVM, CHGJVAPGM, CRTJVAPGM, DMPJVM, DSPJVAPGM et l'API QJVARJPI, n'existent plus
La JVM par défaut est IBM Technology for Java™ 7.1 32 bit (option 14).
- 5770DG1
Les API du serveur HTTP ont changées, tous les modules tiers (non IBM) doivent être recompilés
les directives Order et Deny sont dépréciées (mais toujours fournies), utilisez plutôt
- Require all denied , pour indiquer un refus à priori (comme deny from all)
- Require all granted, pour un accord par défaut (comme Allow from all)
- Require host www.test.org, pour autoriser uniquement un client
Le serveur ne retourne plus le type text/plain par défaut dans les entêtes HTTP, pour les type inconnus (.mbr par ex.)
Il faut ajouter AddType text/html .mbr
Voyez la liste des directives qui changent
- 5770XE1, Client Access pour Windows
Le produit a été déclaré stabilisé et est livré en version 7.1 (même si l'option base de données subie quelques modification)
Le produit stratégique est IBM i Access Client Solutions (5733-XJ1)
Nouveautés SQL de la version 7.2
DB2
- si CPYF créé une table SQL par CRTFILE(*YES), le nouveau fichier est noté comme étant, lui aussi, une table SQL
DSPFD ->
- IBM a fait de nombreuses améliorations concernant la supervision de la mémoire temporaire utilisée
sur WRKSYSSTS
les libellés ont été revus.
(avant on parlait de non protégée utilisée et non protégée maximale)
La gestion de la mémoire temporaire en interne n'a pas changé (dixit IBM),
mais on vous propose un suivi par réceptacles de mémoire temporaire (Bucket, littéralement seau)
Select * from SYSTMPSTG permet d'accéder à la mémoire temporaire utilisée, et ceci en mode SQL (SQL as a service)
l'affichage propose deux type de seaux :
- global -> espace mémoire commun à l'ensemble des travaux
- ceux géré par le microcode sont numérotés de 1 à 4095
- ceux gérés par la gestion des travaux niveau OS sont numérotés de 4096 à 65535
- propre à un JOB
- ils sont numérotés à partir de 65536
- ils sont numérotés à partir de 65536
Un seau est alloué au démarrage du JOB et le lien perdure pendant la durée de ce dernier.
Quand le JOB se termine, l'espace est normalement vide et peux donc être alloué à un autre JOB.
Si l'espace mémoire n'est pas vide, alors il s'agit d'un job n'ayant pas bien fait le "ménage" et l'état est noté *ENDED.
Structure de SYSTMPSTG dans QSYS2 - global -> espace mémoire commun à l'ensemble des travaux
BUCKET_NUMBER
GLOBAL_BUCKET_NAME
JOB_NAME
JOB_USER_NAME
JOB_NUMBER
BUCKET_CURRENT_SIZE
BUCKET_LIMIT_SIZE
BUCKET_PEAK_SIZE
JOB_STATUS
JOB_ENDED_TIMEINTEGER
VARCHAR(30), si BUCKET global
CHAR(10)
CHAR(10)
CHAR(6)
DEC(23 , 0)
DEC(23 , 0)
DEC(23 , 0)
VARCHAR(7) *ENDED | *ACTIVE
TIMESTAMP
BUCKET systèmes :par JOB : (... WHERE JOB_NAME is not null Order by 3 DESC)
D'ailleurs la mémoire temporaire utilisée par JOB est aussi affichée sur WRKACTJOB et est un critère tri (F16)
et sur le détail d'un JOB (5 / Attributs d'exécution), vous verrez maintenant :- La mémoire temporaire utilisée (comme avant)
- le maxima de mémoire temporaire utilisée par ce job
Vous trouverez les mêmes notions sous Navigator for I
Système/Etat du système (comme WRKSYSSTS)
Le bouton "Détail de la mémoire temporaire", vous affiche SYSTMPSTG
Et la colonne mémoire temporaire a été ajoutée à la liste des travaux
- KEEP IN MEMERY NO | YES
la version 7.1 avait apporté la possibilité de demander à ce qu'un fichier soit conservé en mémoire
Paramètre KEEPINMEM sur les commandes CHGPF / CHGLF
-> l'option MEMORY_POOL_PREFERENCE du fichier QAQQINI permet de préciser le pool mémoire à utiliser
cette possibilité est désormais offerte en 7.2 en syntaxe SQL :- CREATE TABLE nom-table (liste des zones) KEEP IN MEMORY YES
- ALTER TABLE nom-table ALTER KEEP IN MEMORY YES
- CREATE INDEX nom-index (liste des clés) [clause WHERE] KEEP IN MEMORY YES
- DECLARE GLOBAL TEMPORARY TABLE nom-table (liste des zones) KEEP IN MEMORY YES
- Nouveau registre CURRENT_USER , contient le profil adopté dans le cas d'un programme en *OWNER.
nous avons donc : - CURRENT_USER ou CURRENT USER : le profil en cours (actualisé en cas d'adoption de droits)
- SYSTEM_USER : le profil de connexion
- SESSION_USER ou USER : à l'origine le profil de connexion (comme SYSTEM_USER) , modifiable par :
SET SESSION AUTHORIZATION 'un-nom'
Rappel, seul un profil avec *ALLOBJ peut lancer l'ordre SET SESSION AUTHORIZATION
- la nouvelle fonction VERIFY_GROUP_FOR_USER vérifie si le profil en cours appartient à un groupe
-
+--SESSION_USER--+
VERIFY_GROUP_FOR_USER(-+------USER------+--, GROUPE1 [, GROUPEn] --)
+-CURRENT_USER---+ - Accord de droits par SQL à des profils de groupe : GRANT ALL ON clients TO GROUP gescom
- L'accord de droit à un profil simple peut être indiqué par GRANT ALL ON clients TO USER michel
Exemple avec un profil qui n'est pas un profil de groupe
Avant la gestion des droits se faisait par GRANT xxx ON table TO CM et ne permettait pas de distinguer utilisateur et groupe
- Nouvelles variables globales dans SYSIBM, pré-renseignées par SQL , propres à la session et en lecture uniquement :
- SYSIBM.CLIENT_HOST (informations TCP/IP du client ou NULL sur une session 5250)
- SYSIBM.CLIENT_IPADDR (idem)
- SYSIBM.CLIENT_PORT (idem)
- SYSIBM.PACKAGE_NAME (*SQLPKG, en cas de connexion DRDA uniquement)
- SYSIBM.PACKAGE_SCHEMA
- SYSIBM.PACKAGE_VERSION
- SYSIBM.ROUTINE_SPECIFIC_NAME (Nom de la procédure en cours ou de la fonction en cours)
- SYSIBM.ROUTINE_SCHEMA
- SYSIBM.ROUTINE_TYPE (P pour procédure, F pour fonction)
- Nouvelles fonctions
- RPAD / LPAD permettent de compléter une chaine par un caractère :
Attention, ces fonctions ne sont disponibles qu'avec la PTF SI53786, incluse dans SF99702 level 2
(et la SI53925 doit ajouter ces fonctions à la version 7.1)
values Lpad('machaine' , 15 , '.')
values Rpad('machaine' , 15 , '.')
- RPAD / LPAD permettent de compléter une chaine par un caractère :
- TRANSFERT OWNERSHIP
Équivalent à CHGOBJOWN
-
.-REVOKE PRIVILEGES---.
-TRANSFER OWNERSHIP OF--| object |--TO--| new-owner |--+---------------------+->
'-PRESERVE PRIVILEGES-'
object
|--+-INDEX--index-name-+----------------------------------------|
+-TABLE--table-name-+
+-VIEW--view-name---+
new-owner
|--+-USER--authorization-name-+---------------------------------|
| +-+-CURRENT USER-+---------+
| +-+-SESSION_USER-+---------+
| -USER-------- +
| +--SYSTEM_USER-------------+
exemples :
le profil en cours appartient-il au groupe QPGMR ? (affiche 1 si c'est exact)
le profil de session appartient-il aux groupes QPGMR ou QSECOFR ?
- TRUNCATE
Équivalent à CLRPFM
Syntaxe
-
-TRUNCATE--+-------+--nom table------------------------------>
.-TABLE-.
.-DROP STORAGE--. .-IGNORE DELETE TRIGGERS--------. .-CONTINUE IDENTITY-.
-+---------------+--+-------------------------------+--+-------------------+--+-----------+-
'-REUSE STORAGE-' '-RESTRICT WHEN DELETE TRIGGERS-' '-RESTART IDENTITY--' '-IMMEDIATE-'
- DROP STORAGE (dft) , l'espace mémoire est récupéré
- REUSE STORAGE, il est conservé pour une utilisation ultérieure
Exemple
DSPFD du fichier
TRUNCATE ... REUSE STORAGE
TRUNCATE ... DROP STORAGE
- IGNORE DELETE TRIGGERS (ne pas tenir compte des triggers BEFORE/AFTER DELETE)
- RESTRICT WHEN DELETE TRIGGERS (ne pas lancer l'instruction s'il y a des triggers)
- CONTINUE IDENTITY, les valeurs pour les champs AS IDENTITY ne sont pas réinitialisées
- IMMEDIATE, cette instruction ne peux pas être "défaite" (pas de ROLLBACK, même sous commitment contrôle)
DSPFD du fichier
puis
essayons rollback
Celui-ci défait les autres transactions non validées, mais pas l'instruction TRUNCATE
DSPFD du fichier
Dernier point, en programmation, le nombre de lignes supprimées n'est pas retourné dans SQLERRD(3) ni par GET DIAGNOSTIC qui retourne -1.
- Nouvelle clause VIOLATION sur les Check constraint
ON INSERT VIOLATION SET column-name = DEFAULT
L'erreur n'est pas signalée, la valeur par défaut est insérée
ON UPDATE VIOLATION PRESERVE column-name
L'erreur n'est pas signalée, la valeur précédente est conservée
Exemple
Vu par System i Navigator
suite à deux INSERT, dont l'un ne renseignant pas la colonne Verifok, nous avons bien les valeurs attendues
select * from VERIF
Mais suite à cet INSERT qui aurait du être refusé
Nous voyons
Enfin, suite à cet UPDATE, lui aussi invalide
Nous voyons toujours
NB : aucun message dans la LOG pour signaler les "remplacement" de valeur
- Jusqu'à maintenant, quand une procédure stockée appelle une procédure stockée, la transaction est globale
-
CREATE PROCEDURE P1
BEGIN
DECLARE CODE CHAR(10);
DECALRE PRB INT;
UPDATE ...
CALL P2(PRB)IF PRB > 0 THEN
ROLLBACK;
ELSE
COMMIT;
END IF;
END;
Le ROLLBACK effectué par P1 annulait aussi les actions base de données effectuées par P2
•désormais vous pourrez rendre P2 indépendant avec le nouveau mot-clé AUTONOMOUS
-
CREATE PROCEDURE P2
(PARAM1 INT)
AUTONOMOUS
BEGIN
.../...
END;
DB2 lance deux transactions distinctes (groupes d'activation différents), ce qui fait qu'un ROLLBACK lancé par P1 n'impacte pas les actions réalisées par P2
- En 7.1 (SF99701/level 19) nous avions la possibilité de définir une valeur par défaut sur les paramètres de procédure
CREATE OR REPLACE PROCEDURE Creation_client
(IN NOCLI DEC( 6, 0),
IN DEPCLI CHAR(3) DEFAULT('44'),
IN DATCLI DATE DEFAULT CURRENT DATE)... / ...
L'appel peut se faire ensuite sous la forme
CALL Creation_client('123456')
CALL Creation_client('123456', '22')
CALL Creation_client('123456', '22', DEFAULT)
Et les paramètres peuvent être nommés :
CALL Creation_client('123456', DATCLI=>'2013-01-17')
En 7.2 la même possibilité est offerte aux fonctions
create function calecheance
SPECIFIC CALECH1
(ladate DATE,
nbjour int default 60)
returns date
language SQL
BEGIN
declare wdate date;
wdate = ladate + nbjours days;
return wdate;
END
Mais quel est le comportement de DB2 si nous créons la fonction suivante
create function calecheance
SPECIFIC CALECH2
(ladate DATE,
nbjour int default 60,
findemois char(1) default 'o')
returns date
language SQL
BEGIN
declare wdate date;
set wdate = ladate + nbjour days ;
if (findemois = 'o') then
set wdate = last_day(wdate);
end if;
return wdate;
END
En effet, il peut exister plusieurs versions d'une même fonction avec des paramètres différents en entrée (cela s'appelle une signature)
Et bien la règle est la suivante :
- recherche des versions de la fonction, compatibles avec les paramètres utilisés :
- seuls les types comptent (CHAR, FLOAT, ...) pas les différences de décimales ou de CCSID
- sur cette version (c'est une nouveauté)
- CHAR, VARCHAR , GRAPHIC sont considérés comme compatibles
- DATE et TIMESTAMP
- DEC et FLOAT
- INTEGER et tous les formats numériques
- même si un type strictement identique sera privilégié.
- prise en compte du nombre de paramètres
- si le choix est multiple, prise en compte du PATH, sélection du schéma le premier rencontré (le plus à gauche comme *LIBL)
- s'il y a plusieurs choix dans le même schéma,aucun avec des paramètres exacts, mais tous compatibles, SQL retourne une erreur.
Dans notre exemple
affiche
il faut utiliser cette écriture pour utiliser la 2eme version
->
- Les timestamp admettent une précision (avant elle était de 6 décimales après la seconde, non paramétrable)
Après INSERT INTO TEST1 (LIBELLE, QUAND) VALUES('test', current timestamp)
->
Après INSERT INTO TEST2 (LIBELLE, QUAND) VALUES('test', current timestamp)
->
CURRENT TIMESTAMP admet un paramètre : la précision (par défaut 6, comme nous venons de le voir)
vous pouvez aussi utiliser LOCALTIMESTAMP(n)
Après INSERT INTO TEST2 (LIBELLE, QUAND) VALUES('test', current timestamp(12) )
->
Ces nouveaux paramètres sont reconnus par RPG et RDI 9.1
Ici l'assistant de création d'une déclaration
Résultat
les champs des deux tables créées plus haut, sont considérés par RPG comme différents, n'ayant pas la même précision
Ce code passe à la compilation
Résultat
L'enregistrement 6 correspond à READ/WRITE, le timestamp copié était sans décimale
L'enregistrement 7 correspond au WRITE RPG suite à alimentation des zones par programme,
comme en version précédente la fonction %TimeStamp() RPG ne fournit qu'une précision de 3
(le hasard a voulu que ce soit 46 s 710 lors de nos tests)
L' option 47 de 5770SS1 (non facturable) apporte RCAC
Row and Column Access Control
Il s'agit de pouvoir indiquer des « droits » à la colonne ou à la ligne qui s'appliquent y compris aux personnes ayant les droits d'administrateur
Ces deux nouvelles options sont accessibles via System i Navigator ou Navigator for i (version Web).•CREATE MASK indique si une colonne est retournée tel que ou totalement/partiellement masquée ('xxx-xxx-xxx-1234' pour un n° de CB)
CREATE [or REPLACE] MASK tel_MASK ON bdvin1/producteurs
FOR COLUMN pr_tel RETURN
CASE
WHEN SESSION_USER = 'QSECOFR'
THEN PR_TEL
WHEN SESSION_USER = 'CM'
THEN left(pr_tel , 3) concat 'XXXXXXXXXXXXX'
ELSE NULL
END
ENABLE
Sous System i Navigator
Puis
ALTER TABLE bdvin1/producteurs
ACTIVATE COLUMN ACCESS CONTROL
Vu par System i Navigator
Attention vous devez avoir les droits QIBM_DB_SECADM (même QSECOFR !)
sinon vous recevrez SQL0552Pour donner ces droits WRKFCNUSG
Option 2 pour modifier
Indiquez
- *USED face à Droits spécial *ALLOBJ pour que QSECOFR puisse manipuler ces notions
- *ALLOWED face à Droits par défaut pour que TOUT LE MONDE puisse manipuler ces notions (déconseillé !)
- sinon indiquez un profil à ajouter (Utilisateur) et *ALLOWED (Utilisation) pour autoriser un profil ou un groupe
OU utilisez Administration d'applications sous System i Navigator
la restriction étant posée, vous pouvez la modifier, retrouver le source et la supprimer, toujours pas System i Navigator
Les restrictions RCAC s'appliquent dans tous les contextes :DSPPFM du fichier sous QSECOFR ->
DSPPFM sous le profil CM ->
Bien sûr la valeur retournée doit être compatible avec le type de la colonne (sinon vous recevez SQL0678)
ICI avec la colonne CAV_PRIX qui est numérique
•1er test refusé : la valeur de remplacement est caractère (xxxxxxxxxx)
•2eme test accepté : la valeur de remplacement est 0
Un MASK n'empêche pas les insertions (par contre vous ne retrouvez pas forcement la donnée telle que vous l'avez insérée, mais masquée)Le problème se pose éventuellement lors des mises à jour :
Exemple , le pgm suivant lit et modifie le producteur 1 en RPG ( fichier qui possède un MASK sur PR_TEL)
lors de l'Update RPG, il met à jour la ligne suivant les données qu'il a lui même reçu.
Suite à un CALL par CM (c'est QSECOFR qui regarde le contenu de la table) :
Y compris un Update RPG avec la fonction %fields
résultat identique
- de faire un trigger, qui rétablisse l'ancienne valeur
IF substr(new.PR_TEL, 4, 13) = 'XXXXXXXXXXXXX' THEN
new.PR_TEL = old.PR_TEL;
... /...
- de faire une contrainte qui refuse la valeur produite par le MASK
CHECK substr(PR_TEL, 4, 13) <> 'XXXXXXXXXXXXX'
- Ou mieux, faites une contrainte qui utilise la nouvelle clause
ON UPDATE VIOLATIONCHECK substr(PR_TEL, 4, 13) <> 'XXXXXXXXXXXXX'
ON UPDATE VIOLATION PRESERVE PR_TEL
L'ancienne valeur sera alors replacée automatiquement, sans message d'erreur
- Ou mieux, faites une contrainte qui utilise la nouvelle clause
La documentation conseille dans ce cas :
Seul un UPDATE SQL (toujours réalisé par CM) , ne met à jour que certains champs (donc ne touche pas aux autres)
et permet d'éviter la création d'une contrainte.
Résultat :
•CREATE PERMISSION indique la(les) règles(s) qui font qu'une ligne peut être vue
Toute ligne ne correspondant pas à la règle est masquée :
Exemple CM ne doit pas voir l'appellation 13 :CREATE [or REPLACE] PERMISSION VINS_ROW_ACCESS ON bdvin1/vins
FOR ROWS
WHERE
SESSION_USER <> 'CM'
OR (SESSION_USER = 'CM'
and (appel_code <> 13 or appel_code IS NULL)
)
ENFORCED FOR ALL ACCESS
ENABLErappelez vous, on indique ce qui peut être vu (une affirmation, donc)
Sous System i Navigator
la restriction étant posée, vous pouvez toujours la modifier, retrouver le source et la supprimer, avec System i Navigator
On aurait aussi pu faire deux permissions
CREATE PERMISSION VINS_ROW_ACCESS1 ON bdvin1/vins
FOR ROWS
WHERE
SESSION_USER <> 'CM'
ENFORCED FOR ALL ACCESS
ENABLE ;
--------------------------------------------------------------------------------------
CREATE PERMISSION VINS_ROW_ACCESS2 ON bdvin1/vins
FOR ROWS
WHERE
SESSION_USER = 'CM'
and (appel_code <> 13 or appel_code IS NULL)
ENFORCED FOR ALL ACCESS
ENABLE ;un peu moins performant en temps de réponse...
Puis
ALTER TABLE bdvin1/vins
ACTIVATE ROW ACCESS CONTROLLe système ajoute alors une permission implicite QIBM_DEFAULT_nomdetable_schema où la permission est si 0=1, donc toujours fausse.
seules les permissions explicites autorisent des lignes à être vues (en bref tout ce qui n'est pas autorisé est interdit)
Donc, Attention, si vous enlever la permission sans désactiver ROW ACCESS CONTROL
plus aucune ligne ne peut être extraite (le fichier apparaît toujours comme vide !)Avec notre PERMISSION "VINS_ROW_ACCESS":
SELECT COUNT(*) from VINS , sous QSECOFR affiche 25.221
SELECT Count(*) from VINS WHERE appel_code = 13 indique un nombre de 811 vins pour cette appellation
SELECT COUNT(*) from VINS , sous CM affiche 24.410Une PERMISSION, peut empécher une insertion ou une mise à jour, qui ne respecte pas la règle
Exemple avec APPEL_CODE à 13 (vous recevez SQ20471)
Administration :
pour modifier : ALTER MASK | PERMISSION
pour retirer : DROP MASK | PERMISSION
tant que vous n'avez pas activé les droits par ALTER TABLE, les MASK et les PERMISSIONS sont inopérants
- nouvel ordre ALTER TRIGGER
ordre SQL, nouveau en 7.2, pour modifier certains paramètres d'un TRIGGER :
- SECURED ce trigger est sécurisé (compatible) avec les droits RCAC
- NOT SECURED ce trigger n'est pas compatible avec les droits RCAC (le défaut)
Il est impossible de modifier cet attribut quand des droits RCAC sont actifs
- ENABLE, le trigger est actif (dft)
- DISABLE, le trigger n'est plus actif
Les mêmes paramètre sont proposés sur CREATE TRIGGER et CREATE FUNCITON
il est impossible de créer un trigger NOT SECURED quand des droits RCAC sont actifs
Détail du message SQ20470
par contre, cet ordre fonctionne
Lors d'un insert, le trigger est lancé sans problème
->
La mise en place ou le retrait des droits RCAC provoque un enregistrement AX dans le journal d'AUDIT.et des enregistrements dans le journal de la table, de code D, type :
- M1 : CREATE MASK
- M2 : DROP MASK
- M3 : ALTER MASK
- P1 : CREATE PERMISSION
- P2 : DROP PERMISSION
- P3 : ALTER PERMISSION
Les droits RCAC sont visibles (mais non modifiables) par EDTOBJAUT/DSPOBJAUT
L'API Retrieve Database File Description (QDBRTVFD) a été modifiée
(nouveau format FILD0500 pour retrouver les informations RCAC)
Sinon, pour voir la liste des droits RCAC, regarder SYSCONTROLS et SYSCONTROLSDEP
- System Openess Include
• SysControls de QSYS2
RCAC_SCHEMA RCAC_NAME RCAC_OWNER TABLE_SCHEMA TABLE_NAME TBCORRELATION COLUMN_NAME SYSTEM_COLUMN_NAME SYSTEM_TABLE_NAME SYSTEM_TABLE_SCHEMA CONTROL_TYPE ENFORCED IMPLICIT ENABLE CREATE_TIME LAST_ALTERED IASP_NUMBER LABEL LONG_COMMENT RULETEXT. |
VARCHAR(128) |
Par exemple :
SELECT RCAC_NAME , cast(RULETEXT as char(2000) ) FROM QSYS2.SYSCONTROLS
WHERE RCAC_SCHEMA = 'BDVIN1'
• SYSCONTROLSDEP affiche les éléments dépendants, par exemple :
CREATE TABLE USEROK INSERT INTO USEROK VALUES('CM', 13); |
CREATE PERMISSION PROD_ROW_ACCESS1 ON producteurs FOR ROWS WHERE appel_code in (select appel_code from USEROK where username = SESSION_USER) ENFORCED FOR ALL ACCESS ENABLE ; --------------------------------------------------------------------------- ALTER TABLE producteurs ACTIVATE ROW ACCESS CONTROL ENFORCED FOR ALL ACCESS ENABLE ; |
SyscontrolsDep contient :
Enfin attention
- une table avec des droits RCAC ne peux pas être sauvegardée pour version précédente.
- une table avec des droits RCAC, restaurée sur un système ne possédant pas l'option 47 ne peux plus être ouverte.
RPG
- Le plus gros des nouveautés était déjà disponible en V7 via la PTF SI51094
- sinon, des efforts ont été fait sur la gestion du CCSID
- Quelques améliorations sur les dates et les timestamps :
- %SUBDT, choix du nombre de chiffres extraits.
par ex : %SUBDT(WDate:*YEARS:4).
- Choix de la précision du timestamp, comme vu plus haut
- la fonction %SECONDS, utilisée dans un calcul admet un argument avec des décimales : %SECONDS(1.5)
- la fonction %DIFF admet un 4ème argument indiquant les millisecondes
%DIFF(ts1:ts2:*SECONDS:5) , permet de recevoir la différence avec 5 chiffres après la seconde
- la fonction %SUBDT admet aussi la précision à extraire
%SUBDT(Z'2014-07-21-15.20.26.123456789012':*SECONDS:11:8) -> extrait 26,12345678
- %SUBDT, choix du nombre de chiffres extraits.
- Directives de compilation
CL
- Après l'arrivée des fonctions intégrées en V7 (via PTF)
-
La PTF SI48166 propose :
%TRIM élimination d'un blanc d'extrémité d'une chaîne
%TRIMR élimination des blancs de droite
%TRIML élimination des blancs de gauche
La PTF SI49061 propose :
%CHECK vérification des caractères d'une variable(gauche->droite)
%CHECKR vérification des caractères d'une variable(droite->gauche)
%SCAN recherche d'une chaîne dans une variable
Système
- Deux nouvelles commandes pour Zipper / Dézipper des fichiers
- CPYFRMARCF, dézippe un fichier (ici le fichier a été généré par 7zip)
Il y a un paramètre RPLDTA- *YES un fichier existant est remplacé lors de la décompression
- *NO, un fichier existant n'est pas remplacé
- CPYTOARCF produit un fichier zip
Un fichier produit à l'aide de cette commande fait la même taille qu'un fichier zippé avec 7zip
( Niveau de compression normale)
- CPYFRMARCF, dézippe un fichier (ici le fichier a été généré par 7zip)
- Nouveau paramètre STRJRN sur les commandes RSTOBJ / RSTLIB
- *YES
La journalisation est démarrée pour les nouveaux objets qui étaient journalisés lors de leur sauvegarde.
- *NO
La journalisation n'est pas démarrée pour les objets qui sont restaurés.
- *YES
- Nouveau paramètre SPLFDTA sur SAVCHGOBJ , permettant d'inclure les spools (comme SAVLIB / SAVOBJ) lors de la sauvegarde
- Nouvelle commande DSPPTFAPYi permet de voir si les PTF sélectionnées (par défaut toutes celles non appliquées)
peuvent être appliquées immédiatement à partir de *SERVICE
- Si des PTF ne peuvent pas être appliquées immédiatement F19 (PTF avec IPL Obligatoire) n'affiche que celles-ci
- Si des PTF ont des préconditions d'application, F20, affiche les préconditions.
- Si des PTF ne peuvent pas être appliquées immédiatement F19 (PTF avec IPL Obligatoire) n'affiche que celles-ci
- Vous connaissiez peut-être RTVSYSINF /UPDSYSINF permettant de sauvegarder le paramétrage système d'une machine
puis de le réappliquer ensuite (éventuellement sur un autre système)
- La 7.2 propose la même chose pour TCP/IP : RTVTCPINF
- il faut créer une bibliothèque avant, puis :
- UPDTCPINF
La mise à jour peut être partielle
- La 7.2 propose la même chose pour TCP/IP : RTVTCPINF
- ARPING permet de retrouver les informations ARP (adresse MAC) pour une adresse IP
Sécurité
SSL supporté pour le fonction remote journal
Nouvelle valeur pour QPWDRULES : *ALLCRTCHG demandant à ce que les règles concernant les mots de passe soient vérifiée y compris lors de l'utilisation des commandes CRTUSRPRF et CHGUSRPRF, couplé avec *LMTPRFNAME, cela empêche la création de profil avec un mot de passe par défaut.
Journal d'AUDIT (codes journaux : T)
- Nouveau poste lié à RCAC (voir plus haut) : type AX
- dans les enregistrements d'audit concernant la modification de paramètres de sécurité, les versions avant et après seront notées
- particulièrement pour les types de postes suivants
- AD (paramétrage de l'audit)
- AU modification d'attributs
- CA modifications de droits
- CP modification d'un profil
- DI serveur LDAP
- GR enregistrement générique (modifications liées à "administration d'applications")
- PA programme adoptant
- PG modification du PGP
- RA RSTAUT
- RJ RSTOBJ d'une JOBD
- RO changement de propriétaire lors d'une restauration
- RZ changement de PGP lors d'une restauration
- C'était déjà le cas pour les postes suivants en version précédente
- SV modification d'une valeur système
- OW modification du propriétaire
- deux nouvelles valeurs d'Audit permettrons de tracer l'application des PTF :
- *PTFOPR and *PTFOBJ
- cela provoque deux nouvelles entrées PF et PU
- la modification des paramètres d'un profil QM, provoque un enregistrement de type X2
SSO (EIM) possible entre deux systèmes pour :
- Telnet
- FTP
- c'était déjà possible pour DDM/DRDA
WRKOBJOWN et WRKOBJPGP possèdent un nouveau paramètre OBJTYPE, permettant de mieux cibler le résultat
SMTP
SMTP peut dorénavant fonctionner en trois modes
- *SMTP , n'utilise plus MSF , ni la directory système (SDD via WRKDIRE), mais la cde ADDUSRSMTP.
- *SMTPMSF , comme *SMTP mais respecte les points d'exit MSF
- *SDD, comme en 7.1
- Avec *SMTP et *SMTPMSF , deux nouvelles commandes sont proposées :
- WRKUSRSMTP permet de gérer les utilisateurs et leurs boites aux lettres
Propriétés d'un utilisateur ADDSMTPUSR/CHGSMTPUSR
Sans paramètre l'adresse de l'utilisateur sera profil@system.domaine (le nom indiqué dans CFGTCP option 12)
Si vous souhaitez le modifier en user@domaine.fr
- SMTP mailbox alias, permet d'indiquer l'ID utilisateur (user à la place de profil)
- SMTP domaine alias, permet d'indiquer le nom de domaine (domaine.fr à la place de systeme.domaine)
Attention, le nom de domaine doit avoir préalablement été indiqué dans les domaines gérés pas SMTP, via CHGSMTPA / ALIASDMN
- Enfin, le paramètre SDD name/address compatibilty permet d'indiquer l'ID utilisateur utilisé précédemment dans le WRKDIRE
(pour compatibilité avec SNDDST)
Nous avons essayé des envois de mail avec SNDDST, SNDSMTPEMM, ces deux commandes fonctionnent et
utilisent comme email de l'emetteur, l'adresse indiquée dans WRKSMTPEMM pour l'utilisateur en cours
L'api QtmmSendMail fonctionne aussi et possède toujours la faculté d'indiquer "manuellement" l'émetteur.
- WRKSMTPEMM, permet de voir l'activité SMTP (plus besoin du journal MSF)
Voici ce que vous pouvez trouver pour la colonne Queue
- *ERR, en erreur, non délivré
- *PND, en attente de traitement
- *WRK, en cours de traitement
- *MSF, envoyé à MSF pour traitement
- *FTR, mail filtré (écarté) par les conditions anti-spam (voir le paramétrage vis System i Navigator depuis la V5)
- *NDL, non délivré, une note a été émise
- *RTY, en attente d'une nouvelle tentative
- *DLV, mail délivré
- 5=Display E-mail
8=Display Log
Sur le premier écran, 9=Display MIME, montre le contenu du message
IBM Navigator for I
Client Access pour Windows et Client Access pour Linux ayant été déclarés stabilisés, Le produit stratégique est IBM i Access Client Solutions
Ce dernier ne contient pas d'équivalent à System i Navigator (Windows), vous devez donc apprendre à utiliser la version accessible par navigateur.
Cette dernière a été améliorée en 7.2 , mais ne contient pas encore toutes les fonctions de la version Windows
Parmi les améliorations, une zone de recherche
Vous pouvez aussi taper une commande système
Si la liste est trop longue, on vous affiche more...
en choisissant cette ligne vous verrez la liste complète des options
Si vous préférez utiliser les mots Anglais, demander à votre navigateur de présenter la langue Anglaise en premier
, ici FIREFOX
Vous pourrez aussi créer des favoris
Que vous retrouverez ici
• Parmi les nouveautés, deux moniteurs, déjà présents dans Gestion centralisée de la version Windows
Moniteur système , permet de surveiller les performances
- Attributs à collecter : CPU, E/S disque, taux d'occupation
- d'associer à chaque attribut, des seuils d'alerte et des actions quand ces seuils sont dépassés
En cliquant sur un attribut
Le moniteur a été créé
On peut le visualiser dans PDI (Performance Data Investigator)
Ou, plus simple, par un clic droit après avoir coché la ligne
(cliquez pour agrandir)Moniteur message , permet de surveiller une MSGQ
Indiquez l'ID message devant constituer événement (Ajout...)
Navigator vous propose une série de message déjà définie
Ensuite, indiquez la commande à exécuter quand l'événement a lieu
Comme avec les moniteurs système, il vous reste à le démarrer
• Toujours dans l'esprit de remplacer Gestion centralisée, version Windows
Vous trouverez une gestion des PTF, dans Configuration et maintenance
WRKPTFGRP
Comparaison et mise à jour, lance un assistant très proche de la version Windows
Indiquez vos options (affichage des différences ou transfert des résultats)
Puis le système cible
Les produits concernés
Sur l'écran récapitulatif, cliquez sur Terminer
• Autre amélioration, quelques ajouts à la gestion des fichiers IFS
Vous pouvez accéder directement à un répertoire (dossier)
Trois nouvelles options :
- Download / Upload
- Edition
Copyright © 1995,2014 VOLUBIS