
V7R20
Nouveautés de la version 7.2
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
- Instalation 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:

Pour toutes les restrictions matérielles (attention aux bandes et aux boucles HSL) : voyez le mémo to User
Nouveautés SQL de la version 7.2
DB2
- SQE est utilisé y compris pour QUERY et OPNQRYF (voir les différences liées à la 7.2)
Pour accèder à ces informations dans le cache des plans d'accès, filtrez sur les chaines :
- OPNQRYF
- Query/400
Exemples

- SQE gère différemment en 7.2 la clause IN avec une longue liste de valeur -> WHERE dep IN (44 ,35, 56, 22, 29, ......)
Quand le nombre de valeurs est important (+ de 80) plutôt que de gérer une suite de OU, SQL créé un liste temporaire contenant la série de valeurs
(VALUES) et fait une jointure, cela n'a aucune incidence sur vos programmes, si ce n'est que certaines requêtes devraient être plus rapides
- 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
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
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_TIME
|
INTEGER
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 possibilté 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---+
|
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 ?

- 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)
Attention, par défaut, ces variables ne sont pas autorisées à *PUBLIC
(exemples sous Squirrel)
avec les droits :
En essayant de modifier la valeur :
- 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 , '.')

- 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-------------+ |

- 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 autre procédure stockée, la transaction est globale
CREATE PROCEDURE P1
BEGIN
DECLARE CODE CHAR(10);
DECLARE 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 date; 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
-> 
- Lors de la définiton d'une variable en SQL PSM (PL/SQL) il est possible de rajouter le mot CONSTANT, assurant que cette variable ne sera pas modifiée
declare MAX dec(9 , 2) CONSTANT 1000; |
- 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, COBOL 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)
- En COBOL
TIMESTAMP(0) |
TIMESTAMP SIZE 19 |
TIMESTAMP(6) |
TIMESTAMP SIZE 26 |
TIMESTAMP(12) |
TIMESTAMP SIZE 32 |
- En Java
Attention
java.SQL.Timestamp ne supporte pas de précision au dela de 9 décimales
IBM implémente alors deux nouvelles classes
- dans la toolbox : AS400JDBCTimestamp pour gérer les précisions jusqu'à 12 chiffres
- java natif : DB2JDBCTimestamp pour gérer les précisions jusqu'à 12 chiffres
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 SQL0552 
Pour 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 modifer, 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

La documentation conseille dans ce cas :
- 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 VIOLATION
CHECK substr(PR_TEL, 4, 13) <> 'XXXXXXXXXXXXX'
|
L'ancienne valeur sera alors replacée automatiquement, sans message d'erreur
|
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 :
Enfin, les données sont masquées, juste avant l'affichage, c'est à dire après jointure et GROUP BY
par exemple, le SELECT suivant, qui donne le nombre de clients par indicatif téléphonique
SELECT LEFT(PR_TEL, 5) , count(*) as nombre
FROM producteurs
GROUP BY LEFT(PR_TEL, 5) |
Affiche :
si la colonne n'est pas masquée |
si la colonne est masquée |
|
|
•CREATE PERMISSION indique la(les) règles(s) qui font qu'une ligne peut être vue
Toute ligne ne correspondant pas à la règle n'est pas retourné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
ENABLE |
rappelez vous, on indique ce qui peut être vu (une affirmation, donc)
Sous System i Navigator

la restriction étant posée, vous pouvez toujours la modifer, 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 CONTROL |
Le 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.410
Une 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
Les mêmes paramètres sont proposés sur CREATE TRIGGER / CREATE FUNCTION, y compris sur les assistants de création :
Navigator for I |
System i Navigator |
 |
 |
 |
 |
La mise en place ou le retraits des droits RCAC :
- impose une allocation exclusive de la table
- 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
• 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)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
VARCHAR(128)
CHAR(10)
CHAR(10)
CHAR(10)
CHAR(1) M=Mask | R=Row permission
CHAR(1)
CHAR(1)
CHAR(1)
TIMESTAMP
TIMESTAMP
SMALLINT
VARCHAR(50)
VARCHAR(2000)
DBCLOB -> c'est ici qu'est la règle, en clair. |
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
(username char(10),
appel_code int
) ;
---------------------------------------------------------------------------
-- l'utilisateur CM ne doit voir que les appellations 13 et 144
INSERT INTO USEROK VALUES('CM', 13);
INSERT INTO USEROK VALUES('CM', 144); |
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 :

• Impact sur les requêtes SQL :
Autant les masques ne s'appliquent que lors de l'affichage (n'ont donc pas d'impact sur les jointures, par exemple)
Autant les permissions sont plus déterminantes :
la jointure n'a lieu qu'avec les lignes autorisées.
INSERT into cible (SELECT * from SOURCE)
- vous subissisez les MASK
- vous ne copiez que les lignes autorisés par les permissions
- les lignes copiées doivent être valides dans la table cible (si elle même possède des droits RCAC)
- SQE fait une jointure, le cas échéant : si le droit RCAC référence une autre table (cas d'utilisation de notre table USEROK)
ici, sous VISUAL Explain, mais aussi dans les moniteurs SQL
Il signale qu'il y a des droits RCAC
il peut recommander des index
Commandes système :
- les droits RCAC sont stockés dans la table elle même, ils sont donc :
- sauvegardés par SAVLIB, SAVOBJ
- déplacés par MOVOBJ
- dupliqués (par défaut) par CRTDUPOBJ
- CRTDUPOBJ et CPYLIB
Quand les Data sont dupliquées, elles le sont à l'identiques (en clair) , les droits RCAC étant aussi dupliqués
Mais, il y a un nouveau paramètre ACCCTL

- *ALL, les droits RCAC sont dupliqués
- *ROW, les permissions sont dupliqués
- *COL , les masques sont dupliqués
- *NONE, rien n'est dupliqué
- CPYF
Seules les données étant copiées (pas les droits RCAC), ne sont dupliqués que les lignes autorisées, et éventuellement masquées.
- Réplication manuelle de fichiers, ou ETL :
Le problème est le même que CPYF, il faut donc explicitement autoriser l'utilisateur OU subir les effets de RCAC !
- Attention aux droits
Les données dans le journal et dans une MQT sont en clair (la réplication basée sur la fonction journal se passera bien)
mais il faut limiter le droit de lire le récepteur, et le droit de lire explicitement une MQT, sinon vous aurez une faille de sécurité !
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
- des efforts ont été fait sur la gestion du CCSID
- Bien sur, toute cette gestion des CCSID ne pourra avoir lieu, que si votre CCSID est connu, donc pas de CCSID à 65535 !
- CCSID au niveau spécif H ou ctl-opt précise le code page des constantes
- AVEC CCSID(*EXACT) c'est le CCSID de compilation qui est utilisé, sinon celui du job à l'exécution
- Une conversion implicite est réalisée dans de nombreux cas :
• par exemple, si une donnée déclarée UTF-8 était comparée à *BLANKS, c'était le blanc EBCDIC -> X'40, ce n'est plus forcément le cas.
• par exemple, lors des concaténations, une convertion implicite sera réalisée si le CCSID des variables est connu.
- Avant le CCSID par défaut était celui du JOB, quand une donnée avait un CCSID différent, elle était convertie dans celui du JOB
(Uniquement pour un même système de codification, par exemple EBCDIC Français -> EBCDIC Espagnol = jeux de caractère identique : Latin-1)
Démonstration avec un fichier un code page Espagnol (284)
- Sous ce CCSID é = x'51' et ñ = x'6A'
<- DSPPFM
- En Français (297) é = x'C0' et ñ = x'49'
lecture du fichier par pgm
En debug

Résultat
'
- maintenant avec le mot-clé CCSID (niveau déclaration)
une variable peut avoir une codification spécifique :
- CCSID(*UTF8) , donnée unicode
- CCSID(819) , données ASCII standard
- CCSID(37), EBCDIC Américain (rappel : 297 pour la France)
- CCSID(*HEX), pas de gestion du CCSID pour cette zone
- Si vous recevez les données lues par le biais de DS, vous utiliserez probablement des data-structures externes (EXTNAME ou LIKEREC)
- CCSID(*EXACT) demande à ce que les zones de la DS aient le même CCSID que le fichier d'origine
- Comme une donnée peut avoir un CCSID particulier, vous pouvez enlever la conversion lors des lectures
- OPENOPT(*NOCVTDATA), niveau spécif H ou ctl-opt, pour tous les fichiers
- DATA(*NOCVT), niveau spécif F ou déclaration de fichier (dcl-f), fichier par fichier
Exemple avec le pgm suivant
En débug RDI
En débug 5250
- Enfin, CCSIDVT est nouveau en spécif H (ou ctl-opt)
- *LIST : indique les pertes potentielles de données lors de la compilation
- *EXCP : indique les pertes potentielles de données lors de l’exécution
- 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
- Directives de compilation
- /SET permet de définir le CCSID ou le format date/heure à partir de cette ligne
- /RESTORE, pour annuler le précédent /SET
CL
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)

- 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.
- Nouveau paramètre SPLFDTA sur SAVCHGOBJ , permettant d'inclure les spools (comme SAVLIB / SAVOBJ) lors de la sauvgarde
- 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.
- 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
- ARPING permet de retrouver les informations ARP (adresse MAC) pour une adresse IP
- Les commandes ADDWLCGRP | CHGWLCGRP | RMVWLCGRP étaient nouvelles en 7.1 (via PTF)
Elles permettent de définir une limite en processeur à un groupe de charge de travail.
(effectivement, si vous n'avez qu'un seul processeur d'actif, ca ne sert à rien !)

Les manières d'utiliser ensuite ces groupes, étaient (sont toujours) d'associer à un groupe :
- Un produit, par ADDWLCGRPE
- Un sous système, en créant une DATAAREA
CRTDTAARA DTAARA(QSYS/QWTWLCGRP)
TYPE(*CHAR) LEN(2000)
VALUE(QBATCH GROUPE1')
Placez ainsi des couples (sous-système/groupe, cadrés sur 20 c.)
- La nouveauté 7.2 (en fait déjà disponible via ptf) se trouve dans la possibilité d'associer un JOB
à un groupe de charge de travail, rendant la notion beaucoup plus granulaire
CHGJOB

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édement 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
Web et Client Access
Client Access version Windows devient "stabilisé", le produit reste en version 7.1 (même s'il propose de nombreuses nouveautés liées à la 7.2)
Le produit de choix devient "IBM i Access, client solution", la version multi-plateformes, qui est en Juillet 2014 en V1R1M3update2 ,
mais qui ne contient pas System i Navigator, il faut alors basculer vers Navigator for i, la version web.
Une nouvelle solution pour mobiles (intégrée à IBM i Access for the Web) est proposée en technology preview
- Gestion des travaux
- Gestion des messages
- Gestion des impressions
- session 5250
- scripts SQL
Ce produit peut aussi être installé sur une version 6.1 ou 7.1
- Installez la version 7.2 de 5770XH2 + SI52768 (quelque soit votre version d'OS).
- Installez
- i7.2 - SF99713 (level 1 ou plus)
- i7.1 - SF99368 (level 27 ou plus)
- i6.1 - SF99115 (level 38 ou plus)
- Passez la commande CFGACCWEB APPSVRTYPE(*INTAPPSVR) INSTANCE(*MOBILE)

Ce que nous avons fait sur notre système principal, en 7.1 et sur notre partition de test en 7.2
- Arrêter, redémarrer le serveur d'administration (ENDTCPSVR *HTTP *ADMIN, puis STRTCPSVR)
- tapez comme URL HTTP://votre-IBMi:2011/iamobile/iWAHome
(ici avec une tablette sous Android)
menu principal (cliquez pour agrandir)
travaux actifs (cliquez pour agrandir)
choix d'une session 5250 (cliquez pour agrandir)
session 5250 (cliquez pour agrandir)
Avec SI54619, vous basculerez sur ce look là :
Le même site est accessible depuis un PC et affiche la page WebAccess "classique"

Dans les deux cas, de nouvelles fonctionnalités sont proposées :
- Avertissement que le mot de passe va arriver à expiration, basé sur la valeur système QPWDEXPWRN
- Gestion des travaux, qui propose les trois mêmes vues que sur l'interface caractère (F11)
mais à l'aide d'icônes:
Vue 1
Vue 2
Vue 3 (avec la mémoire temporaire utilisée)
- Une nouvelle catégorie Système, proposant un accès :
- aux produits installés (GO LICPGM / 10)
- aux valeurs système (WRKSYSVAL)
- Une extractions des données IBM i (poste de répoertoire, PTF, etc...)
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
Les + de System i Navigator (Windows) |
Les + de Navigator for I (web) |
Gestionnaire de scripts |
PDI (analyse des performances en général) |
Visual Explain |
Administration OmniFind |
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


©AF400