Ajout de Restrictions DBA à la condition Join : SET DBAJOIN

Comment :

Lorsque les restrictions DBA sont appliquées à une requête sur une structure multi-segments, les restrictions sont ajoutées par défaut en tant que conditions WHERE dans la requête de rapport. Lorsque le paramètre DBAJOIN est réglé sur ON, les restrictions de DBA sont traitées comme étant internes au fichier ou au segment pour lesquelles elles sont spécifiées, et sont ajoutées à la syntaxe de jointure.

Cette différence est importante lorsque le fichier ou segment limité a un parent dans la structure et la jointure est une jointure externe ou unique.

Lorsque des restrictions sont traitées comme filtres de rapport, les instances de segments de niveau inférieur qui ne les satisfont pas sont omis de la sortie du rapport, avec leurs segments hôtes. Puisque les segments hôtes sont omis, la sortie ne reflète pas une véritable jointure externe ou unique.

Lorsque les restrictions sont traitées comme conditions de jointure, les valeurs de niveau inférieur d'instances de segments qui ne les satisfont pas sont affichées comme valeurs manquantes, et la sortie de rapport affiche toutes les lignes hôtes.


Haut de page

x
Syntaxe : Ajouter des Restrictions DBA à la condition Join
SET DBAJOIN = {OFF|ON}

où :

OFF

Traite les restrictions DBA comme des filtres WHERE dans la requête de rapport. OFF est la valeur par défaut.

ON

Traite les restrictions DBA comme des conditions de jointures.



Exemple : Utilisation du paramètre DBAJOIN avec des tables relationnelles

La requête suivante crée deux tables, EMPINFOSQL et EDINFOSQL :

TABLE FILE EMPLOYEE
SUM LAST_NAME FIRST_NAME CURR_JOBCODE
BY EMP_ID
ON TABLE HOLD AS EMPINFOSQL FORMAT SQLMSS
END
-RUN
TABLE FILE EDUCFILE
SUM COURSE_CODE COURSE_NAME
BY EMP_ID
ON TABLE HOLD AS EDINFOSQL FORMAT SQLMSS
END

Ajoutez les attributs DBA suivantes à la fin du fichier maître EMPINFOSQL généré. Avec les restrictions listées, USER2 ne peut pas extraire les codes 300 et supérieurs :

END
DBA=USER1,$
USER=USER2, ACCESS = R, $
FILENAME=EDINFOSQL,$
USER=USER2, ACCESS = R, RESTRICT = VALUE, NAME=SYSTEM, VALUE=COURSE_CODE LT 300;,$

Ajoutez les attributs DBA suivantes à la fin du fichier maître EMPINFOSQL généré :

END
DBA=USER1,DBAFILE=EMPINFOSQL,$

Lancez la requête suivante :

SET USER=USER2
SET DBAJOIN=OFF
JOIN LEFT_OUTER EMP_ID IN EMPINFOSQL TO MULTIPLE EMP_ID IN EDINFOSQL AS J1
TABLE FILE EMPINFOSQL
PRINT LAST_NAME FIRST_NAME COURSE_CODE COURSE_NAME
ON TABLE SET PAGE NOPAGE
ON TABLE SET STYLE *
GRID=OFF,$
END

Sur la sortie du rapport, toutes les lignes enfants et hôtes ayant des codes 300 ou supérieurs ont été exclus, comme le montre l'image suivante :

Dans le SQL généré, la restriction DBA a été ajoutée au prédicat WHERE de l'instruction SELECT :

SELECT 
  T1."EID",
  T1."LN",
  T1."FN",
  T2."CC",
  T2."CD"
   FROM 
  EMPINFOSQL T1,
  EDINFOSQL T2
   WHERE 
  (T2."EID" = T1."EID") AND 
  (T2."CC" < '300;');

Relancez la requête avec SET DBAJOIN=ON. La sortie affiche maintenant toutes les lignes hôtes, avec des valeurs manquantes substituées pour les instances de segments de niveaux inférieurs ne satisfaisant pas à la restriction DBA, comme le montre l'image suivante :

Dans le SQL généré, la restriction DBA a été ajoutée à la jointure, et il n'y a pas de prédicat WHERE :

SELECT 
  T1."EID",
  T1."LN",
  T1."FN",
  T2."EID",
  T2."CC",
  T2."CD"
   FROM 
  ( EMPINFOSQL T1
   LEFT OUTER JOIN EDINFOSQL T2
   ON T2."EID" = T1."EID" AND 
      (T2."CC" < '300;') );

WebFOCUS