L'utilisation des fonctions METADATA_NEWOBJ et METADATA_SETASSN représente le niveau le plus avancé de l'administration SAS 9. Cette approche programmatique permet d'industrialiser la création de modèles de sécurité complexes, garantissant une reproductibilité parfaite que ne permet pas la manipulation manuelle dans la console de gestion (SMC).
Recommandations et points de vigilance
La précision du typage : Notez l'importance cruciale de définir PublicType="Role" et GroupType="ROLE". Dans le modèle de données SAS, un Rôle est techniquement un objet IdentityGroup. C'est la valeur de ces attributs qui détermine comment l'interface utilisateur traitera l'objet (icône, droits d'édition, etc.). Une erreur ici rendrait l'objet dysfonctionnel ou invisible dans les outils d'administration.
La gestion des associations (Associations) : La fonction metadata_setassn avec l'option "APPEND" est la clé de voûte du script. Elle permet de lier le rôle à ses capacités (via AccessControlEntries) et à son groupe parent. Soyez vigilant : un "APPEND" sur une association qui ne supporte qu'une seule liaison pourrait provoquer des erreurs silencieuses. Vérifiez toujours la cardinalité de l'association dans le dictionnaire du modèle de métadonnées SAS.
Intégrité et Rollback : Contrairement à une base de données SQL classique, les fonctions de métadonnées n'ont pas de mécanisme de "rollback" automatique en cas d'erreur en milieu de Data Step. Si le script échoue après la création de l'objet mais avant l'ajout des capacités, vous vous retrouverez avec un objet orphelin. Il est recommandé de tester chaque code retour (rc) et d'utiliser une logique d'annulation en cas d'échec.
Type : CREATION_INTERNE
Le script ne charge pas de données externes mais interagit avec le référentiel de métadonnées système.
| 1 | DATA _null_; |
| 2 | /**** Initialize Variables ****/ |
| 3 | LENGTH uri $ 38 cap_uri $ 43; |
| 4 | call missing (of _character_); |
| 5 | |
| 6 | /**** Create the object. ****/ |
| 7 | rc=metadata_newobj("IdentityGroup",uri,"New Role Name"); |
| 8 | |
| 9 | /* Add some required attributes. */ |
| 10 | rc=metadata_setattr(uri,"PublicType","Role"); |
| 11 | rc=metadata_setattr(uri,"GroupType","ROLE"); |
| 12 | rc=metadata_setattr(uri,"UsageVersion","1000000.0"); |
| 13 | rc=metadata_setattr(uri,"IsHidden","0"); |
| 14 | |
| 15 | /* Add some optional attributes. */ |
| 16 | rc=metadata_setattr(uri,"Desc","This is the description of the new role"); |
| 17 | rc=metadata_setattr(uri,"DisplayName","This is the display name of the new role"); |
| 18 | |
| 19 | /**** Add a capability. ****/ |
| 20 | |
| 21 | /* Define the search for the access control entry for the capability */ |
| 22 | cap_obj="omsobj:AccessControlEntry?AccessControlEntry[Objects/ApplicationAction[ @Name='Server Manager']]"; |
| 23 | |
| 24 | /* Pull it's URI into the variable cap_uri */ |
| 25 | rc=metadata_getnobj(cap_obj,1,cap_uri); |
| 26 | |
| 27 | /* Add the capability association to the role. */ |
| 28 | rc=metadata_setassn(uri,"AccessControlEntries","APPEND",cap_uri); |
| 29 | |
| 30 | /**** Add the Role to a Group ****/ |
| 31 | rc=metadata_setassn(uri,"MemberIdentities","APPEND","omsobj:IdentityGroup? @Name='group1'"); |
| 32 | RUN; |