'administration manuelle via la SAS Management Console devient vite ingérable dès que le nombre de bibliothèques explose. Ce script illustre une technique avancée d'automatisation en utilisant les fonctions METADATA_*. Il permet de lier dynamiquement des ressources de stockage à des contextes d'exécution (comme le serveur de Stored Processes), une tâche critique pour garantir que vos utilisateurs accèdent aux bonnes données.
Pourquoi cette approche est-elle stratégique ?
Le recours aux fonctions de métadonnées dans une étape DATA _NULL_ offre une flexibilité que les outils graphiques n'ont pas :
Le moteur metadata_setassn : L'utilisation de l'action "Append" sur l'association DeployedComponents est la clé. Elle permet d'ajouter un nouveau serveur d'application à une bibliothèque sans écraser les associations existantes (comme le Workspace Server par défaut).
Sécurité et résolution d'objets : L'usage de metadata_resolve avant toute modification est une excellente pratique. Cela évite les erreurs d'exécution en validant l'existence des URI cibles avant de tenter une mise à jour du référentiel.
Filtrage granulaire : Bien que la requête libobj dans cet exemple nécessite un ajustement (privilégiez un filtre sur @Name ou @Libref), la puissance des sélecteurs omsobj permet de cibler des milliers de bibliothèques selon des critères très précis en une fraction de seconde.
Type : MIXTE
Le script n'utilise pas de données au sens traditionnel (tables SAS). Il lit et modifie des objets (métadonnées) directement sur le serveur de métadonnées SAS. Les 'données' sources sont les définitions des contextes de serveur et des bibliothèques SAS stockées dans les métadonnées.
| 1 | options |
| 2 | metaserver="my.sas.server" |
| 3 | metaport=8561 |
| 4 | metauser="sasadm @saspw" |
| 5 | metapass="password" |
| 6 | metarepository=Foundation |
| 7 | metaprotocol=Bridge; |
| 1 | DATA _null_; |
| 2 | |
| 3 | /* Initialize variables. */ |
| 4 | |
| 5 | LENGTH type id app_uri lib_uri $ 50; |
| 6 | call missing(of _character_); |
| 7 | |
| 8 | /* Define query for the Application Server Context */ |
| 9 | /* to add to the libraries and search for it. */ |
| 10 | |
| 11 | appobj="omsobj:ServerContext? @Name='SASSTP'"; |
| 12 | app_count=metadata_resolve(appobj,type,id); |
| 13 | |
| 14 | /* If no context matches this query, stop the program with an error. */ |
| 15 | |
| 16 | IF app_count <= 0 THEN DO; |
| 17 | put "ERROR: No application server context found matching query " appobj; |
| 18 | stop; |
| 19 | END; |
| 20 | ELSE DO; |
| 21 | |
| 22 | /* Extract the URI of the context if it exists. */ |
| 23 | |
| 24 | rc=metadata_getnobj(appobj,1,app_uri); |
| 25 | |
| 26 | /* Define the query for the libraries to be updated and search for them. */ |
| 27 | |
| 28 | libobj="omsobj:SASLibrary? @code_sas_json/RFValid.json contains '.'"; |
| 29 | lib_count=metadata_resolve(libobj,type,id); |
| 30 | |
| 31 | /* If no libraries match the query, stop the program with an error. */ |
| 32 | IF lib_count <= 0 THEN DO; |
| 33 | put "ERROR: No libraries found matching query " libobj; |
| 34 | stop; |
| 35 | END; |
| 36 | |
| 37 | /* If libraries are found, for each one append */ |
| 38 | /* the context to its list of associated contexts. */ |
| 39 | |
| 40 | ELSE DO n=1 to lib_count; |
| 41 | rc=metadata_getnobj(libobj,1,lib_uri); |
| 42 | rc=metadata_setassn(lib_uri,"DeployedComponents","Append",app_uri); |
| 43 | END; |
| 44 | END; |
| 45 | RUN; |