Pause-Café Volubis

pause-café

rendez-vous technique
Pause-Café est une réunion technique
destinée aux informaticiens sur plateforme IBM i.
Elle a lieu 3 à 4 fois par an : en Bretagne et sur internet.

Pause-café #68

Novembre 2014

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:

 

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


      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 !


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


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

      • *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.)


    • 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



    • 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"

            %}


  • 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

      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 :

    1. La mémoire temporaire utilisée (comme avant)
    2. 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---+


       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)


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

      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'
            ON UPDATE VIOLATION PRESERVE PR_TEL


          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 :



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


    • 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

• 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 :

 

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


  • 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

  • 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)





  • 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 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.

  • 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



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