Publié le :

Nettoyage des Clés Étrangères Orphelines dans les Métadonnées

Ce code est également disponible en : Deutsch English Español
Attention : Ce code nécessite des droits administrateur.
Ce script se connecte au serveur de métadonnées SAS© pour rechercher des objets de type 'ForeignKey' qui sont orphelins, c'est-à-dire qu'ils n'ont pas de clé unique partenaire ('PartnerUniqueKey') associée. Selon la valeur de la macro-variable 'MODE', il peut soit simplement lister les objets trouvés dans le log (MODE=REPORT), soit les supprimer définitivement (MODE=DELETE). C'est un outil de maintenance pour garantir la cohérence des métadonnées.
Analyse des données

Type : EXTERNE


Les données ne proviennent pas de tables SAS mais sont lues directement depuis le serveur de métadonnées SAS. La connexion est établie via les options 'metaserver', 'metaport', etc. Le script interroge l'API des métadonnées pour trouver des objets spécifiques.

1 Bloc de code
DATA STEP
Explication :
Ce bloc DATA _NULL_ est le cœur du programme. Il ne crée aucune table SAS en sortie. Il initialise des variables, conserve la valeur de la macro 'MODE', puis construit une requête pour les métadonnées. Il utilise la fonction `metadata_resolve` pour compter le nombre d'objets 'ForeignKey' correspondant à la requête. S'il en trouve, il boucle sur chaque objet, récupère son URI, son nom, son ID et les informations de la table associée via `metadata_getnobj`, `metadata_getattr` et `metadata_getnasn`. Finalement, il affiche les informations dans le journal SAS et, si le mode est 'DELETE', il tente de supprimer l'objet avec `metadata_delobj` en vérifiant le code retour de l'opération.
Copié !
1DATA _null_;
2 /* Initialize variables. */
3 LENGTH FK_id PT_id $17 type FK_uri PT_uri $50 PT_engine $64 PT_name $32 FK_name $60;
4 call missing ( of _character_ );
5 retain mode "&MODE";
6 
7 /* Define a query for ForeignKey FKobjects that do not have a PartnerUniqueKey association */
8 FK_obj="omsobj:ForeignKey?ForeignKey[not(PartnerUniqueKey/*)]";
9 
10 /* Determine how many foreign key objects meet the criteria */
11 FK_Count=metadata_resolve(FK_obj,type,FK_id);
12 put "NOTE: Found " FK_Count "ForeignKey objects that do not have an associated PartnerUniqueKey";
13 
14 /* If any were found, iterate through each one to get the attributes and associations */
15 IF FK_Count > 0 THEN DO i = 1 to FK_Count;
16 /* Get the URI for the nth ForeignKey found */
17 FK_rc=metadata_getnobj(FK_obj,i,FK_uri);
18 
19 /* Get the name and ID of the ForeignKey FKobject */
20 FK_rc=metadata_getattr(FK_uri,"Name",FK_name);
21 FK_rc=metadata_getattr(FK_uri,"Id",FK_id);
22
23 /* get the table name and id this ForeignKey is associated with */
24 PT_rc=metadata_getnasn(FK_uri,"Table",1,PT_uri);
25 IF PT_rc > 0 THEN DO;
26 /* Get the name and ID of the table. */
27 PT_rc=metadata_getattr(PT_uri,"SASTableName",PT_name);
28 PT_rc=metadata_getattr(PT_uri,"Id",PT_id);
29 END;
30 
31 /* REPORT and DELETE */
32 put "NOTE: Found foreign key: " FK_name "with id: " FK_id "for table: " PT_name "with id: " PT_id;
33 IF mode = "DELETE" THEN DO;
34 FK_rc = metadata_delobj(FK_uri);
35 IF FK_rc THEN put 'ERROR: metadata_delobj failed with return code ' FK_rc;
36 ELSE put 'NOTE: Foreign key successfully deleted';
37 END;
38 END;
39RUN;
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 © 2025, SAS Institute Inc., Cary, NC, USA. All Rights Reserved. * SPDX-License-Identifier: Apache-2.0