
Nouveautés DB2 de la version 7.2
DB2
- SQE est utilisé y compris pour QUERY et OPNQRYF
- 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.
mais, voyez les différences que cela peut générer
en résumé :
- 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.)
- 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
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)

- 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 , '.')

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

- 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);
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')
Ces valeurs par défaut sont désormais affichées par System i Navigator et Navigator for I (ici la fonction DISPLAY_JOURNAL)


Enfin, depuis cette version 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
-> 
- 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 le-nom
pour retirer : DROP MASK | PERMISSION le-nom
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 version 1.3 de Omnifind (5733OMF) est la seule compatible RCAC
Vous trouverez sur les procédures
- SYSPROC.SYSTS_CREATE (création d'un index omnifind)
- SYSPROC.SYSTS_ALTER (modification d'un index existant)
- ROW_COLUMN_ACCESS
- NOT_SECURED (dft)
L'index de recherche n'est pas considéré comme sécurisé pour les contrôles RCAC
- SECURED
L'index de recherche est considéré comme sécurisé pour les contrôles RCAC
Ce dernier point est obligatoire pour construire un index Omnifind sur une table possédant des droits RCAC
Administration
La mise en place ou le retrait 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.
©AF400