Publié le :
Administration CREATION_INTERNE

Suppression d'un Processus Stocké (Stored Process) via Métadonnées

Ce code est également disponible en : Deutsch English Español
En attente de validation
Attention : Ce code nécessite des droits administrateur.
Cette macro, `mm_deletestp`, est conçue pour interagir avec le serveur de métadonnées SAS© afin de supprimer un Processus Stocké spécifique. Elle prend en paramètre le chemin complet du Stored Process (`target=`). La macro commence par vérifier l'existence du Stored Process à l'aide de la fonction `metadata_pathobj`. Si le Stored Process n'est pas trouvé (ou si l'objet n'est pas de type 'ClassifierMap'), un message NOTE est émis et la macro se termine. Si le Stored Process est trouvé, la macro génère un document XML temporaire qui contient les instructions de suppression des métadonnées pour l'objet `ClassifierMap` correspondant au Stored Process. Cette requête XML est ensuite soumise au serveur de métadonnées via `PROC METADATA`. Une fois l'opération exécutée, la macro lit et affiche le résultat de `PROC METADATA` dans le journal SAS©. Enfin, la macro effectue une vérification post-suppression pour s'assurer que le Stored Process a bien été retiré des métadonnées. En cas d'échec de suppression (si l'objet est toujours présent), un message d'erreur est émis et la variable système `syscc` est mise à jour pour indiquer un échec.
Analyse des données

Type : CREATION_INTERNE


La macro interagit principalement avec le serveur de métadonnées SAS pour gérer les Stored Processes. Elle ne consomme pas de données externes ni de jeux de données SASHELP directement pour son fonctionnement principal de suppression. Les données traitées sont des informations de métadonnées générées et gérées par le système SAS lui-même.

1 Bloc de code
DATA STEP (metadata_pathobj) et Macro IF
Explication :
Ce bloc initialise la macro `mm_deletestp` et réalise une première étape de vérification. Il utilise une étape `DATA _NULL_` avec la fonction `metadata_pathobj` pour interroger le serveur de métadonnées. L'objectif est de déterminer si un 'StoredProcess' existe au chemin spécifié par le paramètre `&target`. Le type (`type`) et l'URI (`uri`) de l'objet trouvé sont stockés dans des variables macro. Si l'objet n'est pas identifié comme un 'ClassifierMap' (type interne pour les Stored Processes), une note est émise et la macro se termine, signalant l'absence du Stored Process.
Copié !
1%macro mm_deletestp(
2 target=
3)/*/STORE SOURCE*/;
4 
5/**
6 * Check STP does exist
7 */
8%local cmtype;
9DATA _null_;
10 LENGTH type uri $256;
11 rc=metadata_pathobj("","&target",'StoredProcess',type,uri);
12 call symputx('cmtype',type,'l');
13 call symputx('stpuri',uri,'l');
14RUN;
15%IF &cmtype ne ClassifierMap %THEN %DO;
16 %put NOTE: No Stored Process found at ⌖
17 %return;
18%END;
2 Bloc de code
DATA STEP (Génération XML) Data
Explication :
Ce bloc prépare le terrain pour la suppression en allouant deux filerefs temporaires (`__in` et `__out`) pour l'entrée et la sortie de la procédure `PROC METADATA`. Ensuite, une étape `DATA _NULL_` génère une chaîne XML formatée directement dans le fichier `__in`. Cette chaîne représente une requête de suppression de métadonnées ciblant l'objet 'ClassifierMap' dont l'ID est contenu dans la variable macro `&stpuri`, préparant ainsi l'instruction pour le serveur de métadonnées.
Copié !
1filename __in temp lrecl=10000;
2filename __out temp lrecl=10000;
3DATA _null_ ;
4 file __in ;
5 put "<DeleteMetadata><Metadata><ClassifierMap Id='&stpuri'/>";
6 put "</Metadata><NS>SAS</NS><Flags>268436480</Flags><Options/>";
7 put "</DeleteMetadata>";
8RUN ;
3 Bloc de code
PROC METADATA
Explication :
La procédure `PROC METADATA` est exécutée pour soumettre la requête XML précédemment générée (contenue dans `__in`) au serveur de métadonnées SAS. L'option `verbose` assure qu'un maximum d'informations sur l'exécution et le résultat de la requête est consigné, avec la sortie redirigée vers le fichier temporaire `__out`.
Copié !
1PROC METADATA in=__in out=__out verbose;RUN;
4 Bloc de code
DATA STEP (Lecture de fichier)
Explication :
Ce bloc est une simple étape `DATA _NULL_` qui a pour fonction de lire et d'afficher le contenu du fichier temporaire `__out` dans le journal SAS. Cela permet de visualiser la réponse détaillée du serveur de métadonnées suite à la tentative de suppression.
Copié !
1/* list the result */
2DATA _null_;
3INFILE __out;
4INPUT;
5list;
6 
7RUN;
8 
5 Bloc de code
SAS Global Statement
Explication :
Ces déclarations `filename CLEAR` sont des instructions essentielles pour libérer proprement les filerefs temporaires `__in` et `__out` qui ont été utilisés. C'est une bonne pratique pour éviter la rétention inutile de ressources et les conflits potentiels dans des exécutions SAS ultérieures.
Copié !
1filename __in clear;
2filename __out clear;
6 Bloc de code
DATA STEP (metadata_pathobj) et Macro IF
Explication :
Ce dernier bloc effectue une vérification cruciale après la tentative de suppression. Il utilise à nouveau `metadata_pathobj` pour s'assurer que le Stored Process (`&target`) a bien été retiré des métadonnées. Si l'objet est toujours trouvé et identifié comme un 'ClassifierMap', un message d'erreur est généré dans le journal, la variable système `syscc` est définie à 4 (indiquant une erreur), et la macro se termine pour signaler l'échec de la suppression. Le `%mend` marque la fin de la macro `mm_deletestp`.
Copié !
1/**
2 * Check deletion
3 */
4%local isgone;
5DATA _null_;
6 LENGTH type uri $256;
7 call missing (of _all_);
8 rc=metadata_pathobj("","&target",'Note',type,uri);
9 call symputx('isgone',type,'l');
10RUN;
11%IF &isgone = ClassifierMap %THEN %DO;
12 %put %str(ERR)OR: STP not deleted from ⌖
13 %let syscc=4;
14 %return;
15%END;
16 
17%mend mm_deletestp;
Ce matériel est fourni "tel quel" par We Are Cas. Il n'y a aucune garantie, expresse ou implicite, quant à la qualité marchande ou à l'adéquation à un usage particulier concernant le matériel ou le code contenu dans les présentes. We Are Cas n'est pas responsable des erreurs dans ce matériel tel qu'il existe maintenant ou existera, et We Are Cas ne fournit pas de support technique pour celui-ci.
Informations de Copyright : Copyright (c) 2001-2006 Rodney Sparapani. Ce code est distribué sous les termes de la GNU General Public License (GPL) version 2 ou ultérieure.


Banner
Le Conseil de l'Expert
Expert
Michael
Responsable de l'infrastructure Viya.
« La macro mm_deletestp illustre une méthode de gestion avancée du cycle de vie des applications SAS 9. Contrairement aux suppressions manuelles via la console, l'utilisation de PROC METADATA avec des instructions XML permet une automatisation sécurisée et auditable du nettoyage de vos environnements. Le choix de l'objet technique ClassifierMap est ici crucial, car c'est le type de métadonnées qui définit l'existence même d'un Processus Stocké (Stored Process).

Recommandations et points de vigilance
L'importance des Drapeaux (Flags) : Dans la requête XML, la valeur <Flags>268436480</Flags> est déterminante. Ce masque binaire indique au serveur de métadonnées d'effectuer une suppression incluant potentiellement des objets dépendants ou des associations spécifiques. Une mauvaise configuration des flags pourrait laisser des "objets orphelins" (comme des métadonnées de paramètres ou des codes sources) dans le référentiel, polluant ainsi votre base de métadonnées sur le long terme.

Vérification d'Intégrité : La macro intègre une double validation : avant l'exécution avec metadata_pathobj et après avec une vérification de disparition. C'est une excellente pratique de programmation défensive. Notez l'utilisation de syscc=4 : cela permet d'alerter l'ordonnanceur de votre job qu'une anomalie s'est produite, même si le code SAS lui-même n'a pas crashé.

Portée de la suppression : Attention, cette macro supprime la définition du Stored Process dans les métadonnées. Si votre processus stocké pointe vers un fichier de code physique sur le serveur (fichier .sas), ce fichier restera présent sur le disque. Pour une suppression complète, il faudrait coupler cette macro avec une gestion du système de fichiers via FDELETE. »