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.
SET DBAJOIN = {OFF|ON}
où :
Traite les restrictions DBA comme des filtres WHERE dans la requête de rapport. OFF est la valeur par défaut.
Traite les restrictions DBA comme des conditions de jointures.
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 |