SAS Viya & Python : Comment remplacer une table globale (Global Table) ?
Simon 20 vues
Niveau de difficulté
Débutant
Publié le :
Le conseil de l'expert
Michael
Ne vous fiez pas au paramètre replace=True : il est inefficace sur les tables globales promues, car CAS verrouille l'écrasement direct par sécurité. Pour industrialiser vos scripts Python, intégrez systématiquement une étape de nettoyage préalable : invoquez dropTable (avec l'option quiet=True pour ignorer les erreurs si la table est absente) avant de charger votre nouvelle version
Cet article explique pourquoi cette erreur se produit et la bonne pratique pour mettre à jour vos tables globales sans changer leur nom.
Le Problème : L'écrasement impossible
Imaginez le scénario suivant : vous avez un script Python qui charge un fichier CSV, le transforme, et tente de l'uploader sur le serveur CAS pour le rendre accessible à tout le monde (Promouvoir en Global Scope).
Lors de la première exécution, tout fonctionne. Mais dès la seconde exécution, le script échoue avec le message :
ERROR: Global tables cannot be replaced.
Pourquoi ?
Dans l'architecture CAS, les tables "Globales" (celles qui survivent à la fermeture de votre session et sont visibles par tous) bénéficient d'une protection. Les options promote=True et replace=True ne peuvent pas être utilisées simultanément pour écraser une table globale existante. Le système refuse cette opération pour éviter des conflits d'accès concurrents ou des suppressions accidentelles de données critiques.
Les fausses bonnes idées
Face à ce blocage, on est parfois tenté de :
Ne pas remplacer (replace=False) : Cela échouera car la table existe déjà.
Changer le nom de la table cible : Cela fonctionne techniquement, mais c'est ingérable pour les rapports ou les utilisateurs qui s'attendent à trouver une table nommée ma_table_partagee et non ma_table_v2, v3, etc.
La Solution : Le pattern "Drop & Load"
La méthode la plus propre et robuste pour mettre à jour une table globale tout en conservant son nom consiste à procéder en deux étapes explicites : supprimer l'ancienne version, puis charger/promouvoir la nouvelle.
Voici comment implémenter cela proprement en Python (SWAT) :
Étape 1 : Supprimer la table existante
Utilisez l'action dropTable. L'astuce consiste à ignorer les erreurs si la table n'existe pas encore (par exemple lors de la toute première exécution) grâce à un bloc try/except ou un paramètre quiet.
Étape 2 : Charger et Promouvoir la nouvelle donnée
Une fois la place libérée, vous pouvez charger votre fichier et le promouvoir immédiatement.
Exemple de code complet
New BufferRO
# Nom de la table et librairie cible
table_name = 'ventes_mensuelles'
lib_name = 'public'
# 1. Nettoyage : On supprime la table globale existante
# L'option quiet=True évite une erreur si la table n'existe pas
conn.table.dropTable(name=table_name, caslib=lib_name, quiet=True)
# 2. Chargement : On upload et on promeut la nouvelle version
conn.upload_file('nouvelles_ventes.csv',
casout=dict(name=table_name,
caslib=lib_name,
promote=True))
print(f"La table {table_name} a été mise à jour avec succès.")
# Nom de la table et librairie cible
table_name = 'ventes_mensuelles'
lib_name = 'public'
# 1. Nettoyage : On supprime la table globale existante
# L'option quiet=True évite une erreur si la table n'existe pas
Les codes et exemples fournis sur WeAreCAS.eu sont à but pédagogique. Il est impératif de ne pas les copier-coller aveuglément sur vos environnements de production. La meilleure approche consiste à comprendre la logique avant de l'appliquer. Nous vous recommandons vivement de tester ces scripts dans un environnement de test (Sandbox/Dev). WeAreCAS décline toute responsabilité quant aux éventuels impacts ou pertes de données sur vos systèmes.
SAS et tous les autres noms de produits ou de services de SAS Institute Inc. sont des marques déposées ou des marques de commerce de SAS Institute Inc. aux États-Unis et dans d'autres pays. ® indique un enregistrement aux États-Unis. WeAreCAS est un site communautaire indépendant et n'est pas affilié à SAS Institute Inc.
Ce site utilise des cookies techniques et analytiques pour améliorer votre expérience.
En savoir plus.