SAS Viya & Python : Comment remplacer une table globale (Global Table) ?
Simon 20 vistas
Nivel de dificultad
Débutant
Publicado el :
Consejo del experto
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
Los códigos y ejemplos proporcionados en WeAreCAS.eu son con fines educativos. Es imperativo no copiarlos y pegarlos ciegamente en sus entornos de producción. El mejor enfoque es comprender la lógica antes de aplicarla. Recomendamos encarecidamente probar estos scripts en un entorno de prueba (Sandbox/Dev). WeAreCAS no acepta ninguna responsabilidad por cualquier impacto o pérdida de datos en sus sistemas.
SAS y todos los demás nombres de productos o servicios de SAS Institute Inc. son marcas registradas o marcas comerciales de SAS Institute Inc. en los EE. UU. y otros países. ® indica registro en los EE. UU. WeAreCAS es un sitio comunitario independiente y no está afiliado a SAS Institute Inc.
Este sitio utiliza cookies técnicas y analíticas para mejorar su experiencia.
Saber más.