Publié le :

Test Conditionnel des Contraintes de Table SQL

Ce code est également disponible en : Deutsch English Español
En attente de validation
Le script définit la macro `%conditional` qui, lors de son exécution, adapte son comportement en fonction de l'existence de la vue `sashelp.vcncolu`. Si cette vue est présente (généralement indicative d'un environnement supportant la gestion et l'interrogation des métadonnées de contraintes), la macro crée une table `work.example` avec une clé primaire composite, une contrainte unique composite et une contrainte non null. Elle utilise ensuite `%mp_getconstraints` pour extraire ces contraintes et `%mp_assert` pour vérifier que 6 enregistrements de contraintes sont retournés (le nombre exact peut dépendre de l'implémentation spécifique de `mp_getconstraints` pour les clés composites et contraintes multiples). Si `sashelp.vcncolu` est absente, la table `work.example` est créée sans contraintes, et le test valide que l'extraction des contraintes retourne 0 enregistrement, confirmant l'absence de support ou de visibilité des contraintes dans cet environnement.
Analyse des données

Type : MIXTE


Le script interagit avec une ressource système (`sashelp.vcncolu`) pour sa logique conditionnelle. Il crée dynamiquement des données de test (`work.example`) et des tables de résultats (`work.constraints`, `work.test_results`) pour valider les comportements liés aux contraintes SQL. Aucune donnée externe non gérée par le script n'est utilisée.

1 Bloc de code
MACRO
Explication :
Ce bloc définit et exécute la macro `%conditional`. Il utilise une instruction `%IF/%THEN/%ELSE` avec la fonction `%SYSFUNC(EXIST())` pour vérifier la présence de la vue système `sashelp.vcncolu`. Cette condition détermine si le test doit évaluer un scénario avec des contraintes de table définies (si la vue existe) ou un scénario sans contraintes (si la vue n'existe pas). L'appel final `%conditional()` déclenche l'exécution de cette logique.
Copié !
1%macro conditional();
2 
3%IF %sysfunc(exist(sashelp.vcncolu,view))=1 %THEN %DO;
4 PROC SQL;
5 create TABLE work.example(
6 TX_FROM float FORMAT=datetime19.,
7 DD_TYPE char(16),
8 DD_SOURCE char(2048),
9 DD_SHORTDESC char(256),
10 constraint pk primary key(tx_from, dd_type,dd_source),
11 constraint unq unique(tx_from, dd_type),
12 constraint nnn not null(DD_SHORTDESC)
13 );
14 %mp_assertscope(SNAPSHOT)
15 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
16 %mp_assertscope(COMPARE)
17 
18 %mp_assert(
19 iftrue=(%mf_nobs(work.constraints)=6),
20 desc=OUTPUT TABLE work.constraints created with correct number of records,
21 outds=work.test_results
22 )
23%END;
24%ELSE %DO;
25 PROC SQL;
26 create TABLE work.example(
27 TX_FROM float FORMAT=datetime19.,
28 DD_TYPE char(16),
29 DD_SOURCE char(2048),
30 DD_SHORTDESC char(256)
31 );
32 %mp_assertscope(SNAPSHOT)
33 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
34 %mp_assertscope(COMPARE)
35 
36 %mp_assert(
37 iftrue=(%mf_nobs(work.constraints)=0),
38 desc=Empty TABLE created as constraints not supported,
39 outds=work.test_results
40 )
41%END;
42%mend conditional;
43 
44%conditional()
2 Bloc de code
PROC SQL Data
Explication :
Ce bloc de code est exécuté lorsque la vue `sashelp.vcncolu` est détectée. Il utilise `PROC SQL` pour créer la table `work.example` avec des colonnes `TX_FROM`, `DD_TYPE`, `DD_SOURCE`, `DD_SHORTDESC`, et applique trois contraintes : une clé primaire composite (`pk`), une clé unique composite (`unq`), et une contrainte non-null (`nnn`). Ensuite, les macros `%mp_assertscope(SNAPSHOT)` et `%mp_assertscope(COMPARE)` définissent un contexte de test. `%mp_getconstraints` est appelée pour extraire toutes les contraintes de `work.example` dans la table `work.constraints`. Enfin, `%mp_assert` vérifie que la table `work.constraints` contient exactement 6 enregistrements, validant ainsi la détection correcte des contraintes dans cet environnement.
Copié !
1PROC SQL;
2 create TABLE work.example(
3 TX_FROM float FORMAT=datetime19.,
4 DD_TYPE char(16),
5 DD_SOURCE char(2048),
6 DD_SHORTDESC char(256),
7 constraint pk primary key(tx_from, dd_type,dd_source),
8 constraint unq unique(tx_from, dd_type),
9 constraint nnn not null(DD_SHORTDESC)
10 );
11 %mp_assertscope(SNAPSHOT)
12 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
13 %mp_assertscope(COMPARE)
14 
15 %mp_assert(
16 iftrue=(%mf_nobs(work.constraints)=6),
17 desc=OUTPUT TABLE work.constraints created with correct number of records,
18 outds=work.test_results
19 )
3 Bloc de code
PROC SQL Data
Explication :
Ce bloc de code est exécuté lorsque la vue `sashelp.vcncolu` n'est pas détectée. Il crée la table `work.example` en utilisant `PROC SQL` mais sans aucune contrainte explicite. Comme dans le cas précédent, les macros `%mp_assertscope(SNAPSHOT)` et `%mp_assertscope(COMPARE)` établissent le contexte de test, et `%mp_getconstraints` tente d'extraire les contraintes. L'assertion finale `%mp_assert` valide que la table `work.constraints` est vide (0 enregistrement), confirmant qu'aucune contrainte n'est détectée ou supportée dans cet environnement, ce qui est le comportement attendu dans ce scénario.
Copié !
1PROC SQL;
2 create TABLE work.example(
3 TX_FROM float FORMAT=datetime19.,
4 DD_TYPE char(16),
5 DD_SOURCE char(2048),
6 DD_SHORTDESC char(256)
7 );
8 %mp_assertscope(SNAPSHOT)
9 %mp_getconstraints(lib=work,ds=example,outds=work.constraints)
10 %mp_assertscope(COMPARE)
11 
12 %mp_assert(
13 iftrue=(%mf_nobs(work.constraints)=0),
14 desc=Empty TABLE created as constraints not supported,
15 outds=work.test_results
16 )
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 : Le code utilise des macros (`%mp_assert`, `%mp_getconstraints`, `%mf_nobs`, `%mp_assertscope`) faisant partie du framework SASUnit. Le fichier référencé `macro_without_brief_tag.sas` indique un copyright 'Copyright 2010-2023 HMS Analytical Software GmbH', l'éditeur de SASUnit.