SAS Viya & Python : Comment remplacer une table globale (Global Table) ?
Simon 20 Aufrufe
Schwierigkeitsgrad
Débutant
Veröffentlicht am :
Expertenrat
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
Die auf WeAreCAS.eu bereitgestellten Codes und Beispiele dienen Lehrzwecken. Es ist zwingend erforderlich, sie nicht blind in Ihre Produktionsumgebungen zu kopieren. Der beste Ansatz besteht darin, die Logik zu verstehen, bevor sie angewendet wird. Wir empfehlen dringend, diese Skripte in einer Testumgebung (Sandbox/Dev) zu testen. WeAreCAS übernimmt keine Verantwortung für mögliche Auswirkungen oder Datenverluste auf Ihren Systemen.
SAS und alle anderen Produkt- oder Dienstleistungsnamen von SAS Institute Inc. sind eingetragene Marken oder Marken von SAS Institute Inc. in den USA und anderen Ländern. ® zeigt die Registrierung in den USA an. WeAreCAS ist eine unabhängige Community-Site und nicht mit SAS Institute Inc. verbunden.
Diese Website verwendet technische und analytische Cookies, um Ihre Erfahrung zu verbessern.
Mehr erfahren.