Utilisation de la fonction de création de scripts Python pour la réconciliation par lots et la réinjection des versions
Les administrateurs de géodatabase ArcGIS peuvent utiliser la fonction de création de scripts Python pour automatiser de nombreuses tâches généralement effectuées à l'aide de plusieurs outils de géotraitement. Cette rubrique traite du processus qu'un administrateur peut adopter pour exécuter une réconciliation de versions planifiée, exécutée de nuit.
Beaucoup d'administrateurs souhaitent s'assurer qu'aucun autre utilisateur n'est connecté à la base de données lorsqu'ils exécutent leur réconciliation. Les fonctions ListUsers et DisconnectUser d'ArcPy peuvent permettre de garantir que seul l'administrateur est connecté à la base de données.
Recherche d'utilisateurs connectés
La première étape de la déconnexion des utilisateurs consiste à déterminer qui est connecté à la base de données. Pour cela est utilisée la fonction ListUsers, qui passe à une connexion d'administrateur.
# get a list of connected users.
userList = arcpy.ListUsers("Database Connections/admin.sde")
Analyse de la liste d'utilisateurs connectés
Une fois créée, la liste d'utilisateurs connectés peut permettre de signaler aux utilisateurs qu'ils doivent se déconnecter. Pour cela, obtenez une liste des utilisateurs et des adresses électroniques associées, par exemple.
A des fins de simplicité, cet exemple part du principe que chaque utilisateur connecté à la base de données présente le même nom de base que son adresse électronique. Cet exemple peut facilement être modifié de façon à inclure d'autres méthodes permettant de déterminer des adresses électroniques.
# get a list of usernames from the list of named tuples returned from ListUsers
userNames = [u.Name for u in userList]
# take the userNames list and make email addresses by appending the appropriate suffix.
emailList = [name + '@company.com' for name in userNames]
Génération et envoi d'un courrier électronique
Une fois la liste de courriers électroniques générée, Python peut envoyer un courrier électronique. Cet exemple utilise le module smtplib de Python, mais il existe d'autres méthodes d'envoi de courriers électroniques, via des modules non standard.
Pour en savoir plus sur le module smtplib, consultez la documentation Python, à l'adresse suivante :
import smtplib
SERVER = "mailserver.yourcompany.com"
FROM = "SDE Admin <python@yourcompany.com>"
TO = emailList
SUBJECT = "Maintenance is about to be performed"
MSG = "Auto generated Message.\n\rServer maintenance will be performed in 15 minutes. Please log off."
# Prepare actual message
MESSAGE = """\
From: %s
To: %s
Subject: %s
%s
""" % (FROM, ", ".join(TO), SUBJECT, MSG)
# Send the mail
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, MESSAGE)
server.quit()
Regroupement par blocs des connexions à la base de données
Le workflow permettant de regrouper les connexions par blocs dans la base de données, via la création de scripts, repose sur l'utilisation de la fonction AcceptingConnections d'ArcPy. Cette fonction est uniquement disponible via la création de scripts Python.
Une fois les utilisateurs avertis, le script s'interrompt pendant 15 minutes, puis les utilisateurs sont déconnectés.
#block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
Pour effectuer cette maintenance, il n'est pas nécessaire de regrouper par blocs les connexions à la base de données, ou de déconnecter tous les utilisateurs. Si votre organisation peut gérer la déconnexion de l'ensemble des connexions, il se peut que le processus de compression soit plus efficace.
Interruption du script
Le script doit s'interrompre pendant 15 minutes, afin de permettre aux utilisateurs de terminer leur tâche en cours avant de se déconnecter. Le module temporel de Python peut servir à accorder ce délai de 15 minutes, avant que les utilisateurs ne soient déconnectés.
import time
time.sleep(900)#time is specified in seconds
Déconnexion des utilisateurs
Le workflow permettant de déconnecter des utilisateurs via la fonction de création de scripts repose sur l'utilisation de la fonction DisconnectUser d'ArcPy. Cette fonction est uniquement disponible via la création de scripts Python.
Une fois les utilisateurs avertis, le script s'interrompt pendant 15 minutes, puis les utilisateurs sont déconnectés.
#disconnect all users from the database.
arcpy.DisconnectUser('Database Connections/admin.sde', "ALL")
Si vous voulez que seuls des utilisateurs spécifiques soient déconnectés, vous pouvez indiquer l'ID renvoyé par la fonction ListUsers ou la boîte de dialogue Utilisateurs connectés sous la forme d'une chaîne ou d'une liste de chaînes Python pour déconnecter ces utilisateurs.
Réconciliation par lot
L'outil Réconcilier les versions peut servir à réconcilier et à injecter toutes les versions dans une géodatabase d'entreprise. Cet outil fournit des options permettant de réconcilier toutes les versions de la géodatabase dans une seule et même version cible, ou uniquement les versions par défaut. Cet outil permet une compression efficace, ainsi que la réconciliation et la réinjection de plusieurs versions en même temps, selon un ordre défini. Dans cet exemple, cet outil est exécuté par l'administrateur de géodatabase. Grâce à votre connexion en tant qu'administrateur de géodatabase, vous pouvez réconcilier et réinjecter toutes les versions dans la géodatabase, même celles qui sont privées ou protégées et qui appartiennent à d'autres utilisateurs.
Pour en savoir plus sur l'outil de géotraitement Réconcilier les versions
# Get a list of versions to pass into the ReconcileVersions tool.
versionList = arcpy.ListVersions('Database Connections/admin.sde')
# Execute the ReconcileVersions tool.
arcpy.ReconcileVersions_management('Database Connections/admin.sde', "ALL_VERSIONS", "sde.DEFAULT", versionList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "DELETE_VERSION", "c:/temp/reconcilelog.txt")
Compression de la géodatabase
Une fois la réconciliation et la réinjection effectuées, vous devez impérativement compresser la base de données, afin de supprimer les informations en double et d'enregistrer les mises à jour dans les tables métier.
# Run the compress tool.
arcpy.Compress_management('Database Connections/admin.sde')
Recréation d'index et mise à jour des statistiques
Après une opération de compression, il est recommandé de recréer les index et de mettre à jour les statistiques. Ces étapes peuvent être effectuées à l'aide des outils Recréer les index et Analyser les jeux de données. Grâce à ces outils, vous pouvez saisir une liste de jeux de données en entrée ; toutes leurs fonctions seront exécutées sur l'ensemble des jeux de données, simultanément. Ces outils mettent également à jour les statistiques et recréent des index pour les tables système appropriées. La première partie à ce processus consiste à obtenir une liste des données appartenant à l'utilisateur. Les index et statistiques peuvent être mis à jour uniquement par le propriétaire des données, ou par les utilisateurs disposant de certains privilèges d'administrateur.
# set the workspace
arcpy.env.workspace = 'Database Connections/admin.sde'
# Get the user name for the workspace
# this assumes you are using database authentication.
# OS authentication connection files do not have a 'user' property.
userName = arcpy.Describe(arcpy.env.workspace).connectionProperties.user
# Get a list of all the datasets the user has access to.
# First, get all the stand alone tables, feature classes and rasters owned by the current user.
dataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*')
# Next, for feature datasets owned by the current user
# get all of the featureclasses and add them to the master list.
for dataset in arcpy.ListDatasets('*.' + userName + '.*'):
dataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
Une fois identifiée, la liste de données appartenant à l'utilisateur peut être transmise aux outils Recréer les index et Analyser les jeux de données.
A des fins de simplicité, ce script part du principe que l'administrateur est également le propriétaire des données. Dans le cas de propriétaires multiples, il est nécessaire de générer une liste des données de chaque propriétaire et de la transmettre aux outils Recréer les index et Analyser les jeux de données.
Les jetons de caractères génériques utilisés pour limiter l'affichage du nombre de jeux de données appartenant à l'utilisateur dépendent du système d'exploitation. L'exemple ci-dessus ('*.' + userName + '.*') fonctionne dans le cas de SQL Server, de PostgreSQL ou de DB2. Dans le cas d'Oracle, on peut utiliser le caractère suivant : (userName + '.*'). Dans le cas d'Informix, cela peut être : (userName + '.*').
# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option the user must be an administrator.
workspace = "Database Connections/admin.sde"
arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
Exemple de code complet
L'exemple de code ci-dessous réunit tous les éléments indiqués ci-dessus et porte sur les opérations suivantes :
- Identifie les utilisateurs connectés
- Envoie une notification par courrier électronique
- Empêche la base de données d'accepter de nouvelles connexions
- Déconnecte les utilisateurs
- Réconcilie les versions
- Compresse la base de données
- Recrée des index et rassemble des statistiques
- Autorise la base de données à accepter de nouvelles connexions
import arcpy, time, smtplib
# set the workspace
arcpy.env.workspace = 'Database Connections/admin.sde'
# set a variable for the workspace
workspace = arcpy.env.workspace
# get a list of connected users.
userList = arcpy.ListUsers("Database Connections/admin.sde")
# get a list of usernames of users currently connected and make email addresses
emailList = [u.Name + "@yourcompany.com" for user in arcpy.ListUsers("Database Connections/admin.sde")]
# take the email list and use it to send an email to connected users.
SERVER = "mailserver.yourcompany.com"
FROM = "SDE Admin <python@yourcompany.com>"
TO = emailList
SUBJECT = "Maintenance is about to be performed"
MSG = "Auto generated Message.\n\rServer maintenance will be performed in 15 minutes. Please log off."
# Prepare actual message
MESSAGE = """\
From: %s
To: %s
Subject: %s
%s
""" % (FROM, ", ".join(TO), SUBJECT, MSG)
# Send the mail
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, MESSAGE)
server.quit()
#block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
# wait 15 minutes
time.sleep(900)
#disconnect all users from the database.
arcpy.DisconnectUser('Database Connections/admin.sde', "ALL")
# Get a list of versions to pass into the ReconcileVersions tool.
versionList = arcpy.ListVersions('Database Connections/admin.sde')
# Execute the ReconcileVersions tool.
arcpy.ReconcileVersions_management('Database Connections/admin.sde', "ALL_VERSIONS", "sde.DEFAULT", versionList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "DELETE_VERSION", "c:/temp/reconcilelog.txt")
# Run the compress tool.
arcpy.Compress_management('Database Connections/admin.sde')
#Allow the database to begin accepting connections again
arcpy.AcceptConnections('Database Connections/admin.sde', True)
#Get a list of datasets owned by the admin user
# Get the user name for the workspace
# this assumes you are using database authentication.
# OS authentication connection files do not have a 'user' property.
userName = arcpy.Describe(arcpy.env.workspace).connectionProperties.user
# Get a list of all the datasets the user has access to.
# First, get all the stand alone tables, feature classes and rasters.
dataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*')
# Next, for feature datasets get all of the featureclasses
# from the list and add them to the master list.
for dataset in arcpy.ListDatasets('*.' + userName + '.*'):
dataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
# pass in the list of datasets owned by the admin to the rebuild indexes and analyze datasets tools
# Note: to use the "SYSTEM" option the user must be an administrator.
arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
Planification automatisée du script
Une fois exécuté, un script peut être réexécuté à des intervalles et à une heure spécifiques. Pour planifier cette réexécution, utilisez le planificateur de tâches du système d'exploitation.
Pour obtenir des instructions sur la définition d'une tâche prévue pour s'exécuter sur Windows, consultez la rubrique Programmation d'un script Python pour qu'il s'exécute à des moments définis.