Veröffentlicht am :
Administration CREATION_INTERNE

Löschen eines Stored Process über Metadaten

Dieser Code ist auch verfügbar auf: English Español Français
Wartet auf Validierung
Attention : Dieser Code erfordert Administratorrechte.
Dieses Makro, `mm_deletestp`, wurde entwickelt, um mit dem SAS©-Metadatenserver zu interagieren und einen spezifischen Stored Process zu löschen. Es nimmt den vollständigen Pfad des Stored Process (`target=`) als Parameter entgegen. Das Makro beginnt mit der Überprüfung der Existenz des Stored Process mithilfe der Funktion `metadata_pathobj`. Wenn der Stored Process nicht gefunden wird (oder wenn das Objekt nicht vom Typ 'ClassifierMap' ist), wird eine NOTE-Meldung ausgegeben und das Makro beendet. Wenn der Stored Process gefunden wird, generiert das Makro ein temporäres XML-Dokument, das die Anweisungen zum Löschen von Metadaten für das dem Stored Process entsprechende `ClassifierMap`-Objekt enthält. Diese XML-Anfrage wird dann über `PROC METADATA` an den Metadatenserver übermittelt. Nach Ausführung der Operation liest und zeigt das Makro das Ergebnis von `PROC METADATA` im SAS©-Log an. Schließlich führt das Makro eine Überprüfung nach der Löschung durch, um sicherzustellen, dass der Stored Process erfolgreich aus den Metadaten entfernt wurde. Im Falle eines Löschfehlers (wenn das Objekt noch vorhanden ist), wird eine Fehlermeldung ausgegeben und die Systemvariable `syscc` wird aktualisiert, um einen Fehler anzuzeigen.
Datenanalyse

Type : CREATION_INTERNE


Das Makro interagiert hauptsächlich mit dem SAS-Metadatenserver, um Stored Processes zu verwalten. Es verbraucht für seine Hauptlöschfunktion keine externen Daten oder SASHELP-Datasets direkt. Die verarbeiteten Daten sind Metadateninformationen, die vom SAS-System selbst generiert und verwaltet werden.

1 Codeblock
DATA STEP (metadata_pathobj) und Macro IF
Erklärung :
Dieser Block initialisiert das Makro `mm_deletestp` und führt einen ersten Überprüfungsschritt durch. Er verwendet einen `DATA _NULL_`-Schritt mit der Funktion `metadata_pathobj`, um den Metadatenserver abzufragen. Ziel ist es, festzustellen, ob ein 'StoredProcess' unter dem durch den Parameter `&target` angegebenen Pfad existiert. Der Typ (`type`) und der URI (`uri`) des gefundenen Objekts werden in Makrovariablen gespeichert. Wenn das Objekt nicht als 'ClassifierMap' (interner Typ für Stored Processes) identifiziert wird, wird eine Notiz ausgegeben und das Makro beendet, was das Fehlen des Stored Process signalisiert.
Kopiert!
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 Codeblock
DATA STEP (Génération XML) Data
Erklärung :
Dieser Block bereitet die Löschung vor, indem zwei temporäre Filerefs (`__in` und `__out`) für die Eingabe und Ausgabe der `PROC METADATA`-Prozedur zugewiesen werden. Anschließend generiert ein `DATA _NULL_`-Schritt eine formatierte XML-Zeichenfolge direkt in die Datei `__in`. Diese Zeichenfolge stellt eine Metadaten-Löschungsanfrage dar, die auf das 'ClassifierMap'-Objekt abzielt, dessen ID in der Makrovariable `&stpuri` enthalten ist, und bereitet so die Anweisung für den Metadatenserver vor.
Kopiert!
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 Codeblock
PROC METADATA
Erklärung :
Die Prozedur `PROC METADATA` wird ausgeführt, um die zuvor generierte XML-Anfrage (enthalten in `__in`) an den SAS-Metadatenserver zu übermitteln. Die Option `verbose` stellt sicher, dass maximale Informationen über die Ausführung und das Ergebnis der Anfrage protokolliert werden, wobei die Ausgabe in die temporäre Datei `__out` umgeleitet wird.
Kopiert!
1PROC METADATA in=__in out=__out verbose;RUN;
4 Codeblock
DATA STEP (Lecture de fichier)
Erklärung :
Dieser Block ist ein einfacher `DATA _NULL_`-Schritt, dessen Funktion darin besteht, den Inhalt der temporären Datei `__out` im SAS-Log zu lesen und anzuzeigen. Dies ermöglicht die Visualisierung der detaillierten Antwort des Metadatenservers nach dem Löschversuch.
Kopiert!
1/* list the result */
2DATA _null_;
3INFILE __out;
4INPUT;
5list;
6 
7RUN;
8 
5 Codeblock
SAS Global Statement
Erklärung :
Diese `filename CLEAR`-Deklarationen sind wesentliche Anweisungen, um die verwendeten temporären Filerefs `__in` und `__out` sauber freizugeben. Dies ist eine bewährte Methode, um die unnötige Beibehaltung von Ressourcen und potenzielle Konflikte bei späteren SAS-Ausführungen zu vermeiden.
Kopiert!
1filename __in clear;
2filename __out clear;
6 Codeblock
DATA STEP (metadata_pathobj) und Macro IF
Erklärung :
Dieser letzte Block führt eine entscheidende Überprüfung nach dem Löschversuch durch. Er verwendet erneut `metadata_pathobj`, um sicherzustellen, dass der Stored Process (`&target`) erfolgreich aus den Metadaten entfernt wurde. Wenn das Objekt immer noch gefunden und als 'ClassifierMap' identifiziert wird, wird eine Fehlermeldung im Log generiert, die Systemvariable `syscc` wird auf 4 gesetzt (was einen Fehler anzeigt), und das Makro wird beendet, um das Fehlschlagen der Löschung zu signalisieren. Das `%mend` markiert das Ende des Makros `mm_deletestp`.
Kopiert!
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;
Dieses Material wird von We Are Cas "wie besehen" zur Verfügung gestellt. Es gibt keine ausdrücklichen oder stillschweigenden Garantien hinsichtlich der Marktgängigkeit oder Eignung für einen bestimmten Zweck in Bezug auf die hierin enthaltenen Materialien oder Codes. We Are Cas ist nicht verantwortlich für Fehler in diesem Material, wie es jetzt existiert oder existieren wird, noch bietet We Are Cas technischen Support dafür an.
Urheberrechtsinformationen : Copyright (c) 2001-2006 Rodney Sparapani. Dieser Code wird unter den Bedingungen der GNU General Public License (GPL) Version 2 oder höher vertrieben.


Banner
Expertenrat
Expert
Simon
Expert SAS et fondateur.
« Das Makro mm_deletestp ist ein hervorragendes Beispiel für die professionelle Administration einer SAS 9-Umgebung. Anstatt Objekte manuell über die SAS Management Console zu löschen, nutzt dieses Skript die Open Metadata Architecture (OMA), um Löschvorgänge zu automatisieren und auditierbar zu machen. Der Fokus auf den Objekttyp ClassifierMap ist hierbei entscheidend, da dieser in der Metadatenhierarchie die technische Definition eines Stored Process repräsentiert.

Strategische Empfehlungen & Best Practices
Bedeutung der Flags: In der XML-Anfrage wird der Wert <Flags>268436480</Flags> verwendet. Diese Bitmaske ist kritisch: Sie steuert, ob nur das Objekt selbst oder auch abhängige Assoziationen gelöscht werden. Ein falsches Flag könnte "verwaiste" Metadaten (wie Parameterdefinitionen oder Quellcode-Notizen) im Repository hinterlassen, was langfristig die Integrität der Metadatenbank beeinträchtigt.

Defensive Programmierung: Das Makro implementiert eine wichtige doppelte Validierung. Vor dem Löschen wird die Existenz via metadata_pathobj geprüft, und nach dem Prozess erfolgt eine Erfolgskontrolle. Die explizite Setzung von syscc=4 im Fehlerfall ist essenziell, damit übergeordnete Batch-Scheduler (wie LSF oder SAS Job Execution) den Abbruch des Prozesses registrieren können.

Physische vs. Logische Löschung: Beachten Sie, dass dieses Makro die Metadatendefinition löscht. Wenn der Quellcode des Stored Process in einer externen .sas-Datei auf dem Server liegt, bleibt diese Datei physisch erhalten. Für eine vollständige Bereinigung müsste das Makro um eine FDELETE-Logik für das Filesystem erweitert werden. »