- Rechercher les utilisateurs connectés
- Analyser la liste d'utilisateurs connectés
- Générer et envoyer un courrier électronique
- Bloquer les connexions à la géodatabase
- Suspendre le script
- Déconnecter les utilisateurs
- Réconcilier par lot les versions et réinjecter les modifications
- Compression de la géodatabase
- Autoriser les connexions à la géodatabase
- Recréer les index et mettre à jour les statistiques
- Exemple de code complet
- Planification automatisée du script
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. Il est possible d'utiliser les fonctions ArcPy ListUsers et DisconnectUser pour garantir que seul l'administrateur est connecté à la géodatabase.
Rechercher les utilisateurs connectés
En premier lieu, utilisez la fonction ListUsers pour déterminer qui est connecté à la géodatabase. Vous devez fournir une connexion d'administrateur de géodatabase pour pouvoir exécuter la fonction ListUsers.
# get a list of connected users.
userList = arcpy.ListUsers("Database Connections/admin.sde")
Analyser la liste d'utilisateurs connectés
Une fois que vous possédez la liste des utilisateurs connectés, vous pouvez avertir ces utilisateurs qu'ils doivent se déconnecter de la géodatabase. Pour cela, obtenez la liste des utilisateurs et de leurs adresses électroniques associées.
Par souci de simplicité, cet exemple suppose que chaque utilisateur connecté à la géodatabase présente le même nom de base que son adresse électronique. Cet exemple pourrait être modifié de façon à inclure d'autres méthodes permettant de déterminer les adresses électroniques.
# get a list of user names 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érer et envoyer un courrier électronique
Utilisez la liste des courriers électroniques pour envoyer des messages électroniques aux utilisateurs à partir de Python afin de les informer qu'ils doivent se déconnecter de la géodatabase. Cet exemple utilise le module smtplib de Python, mais il existe d'autres options d'envoi des courriers électroniques, via des modules non standard.
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()
Bloquer les connexions à la géodatabase
Utilisez la fonction ArcPy AcceptConnections pour bloquer les connexions à la géodatabase via la création de scripts. Cette fonction est uniquement disponible via la création de scripts Python.
Cela empêchera les nouveaux utilisateurs de se connecter à la géodatabase. Les connexions actuelles continueront d'exister.
#block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
Suspendre le 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éconnecter les utilisateurs
Utilisez la fonction ArcPy DisconnectUser pour déconnecter des utilisateurs via la création de scripts. 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")
Réconcilier par lot les versions et réinjecter les modifications
L'outil Réconcilier les versions peut servir à réconcilier et à réinjecter toutes les versions dans une géodatabase d'entreprise. Cet outil fournit des options permettant de réconcilier toutes les versions dans la géodatabase vers une version cible (ALL_VERSIONS) ou simplement les versions qui empêchent la compression de la version cible (BLOCKING_VERSIONS). 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, l'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.
# 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 des modifications effectuées, il est important de compresser la géodatabase, afin de supprimer toutes les informations redondantes et d'enregistrer les mises à jour dans les tables métier.
# Run the compress tool.
arcpy.Compress_management('Database Connections/admin.sde')
Autoriser les connexions à la géodatabase
A présent que vous avez fini de réconcilier et réinjecter les versions et que vous avez compressé la géodatabase, vous pouvez autoriser les utilisateurs à se connecter.
# Allow new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', True)
Recréer les index et mettre à jour les 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. Ces outils vous permettent de saisir une liste de jeux de données en entrée et ils exécuteront leurs fonctions simultanément sur l'ensemble des jeux de données. Ces outils mettent également à jour les statistiques et recréent des index pour les tables système appropriées, lorsqu'ils sont exécutés par l'administrateur de géodatabase. La première partie de ce processus consiste à obtenir une liste des données et des utilisateurs qui possèdent ces données. Les index et statistiques peuvent être mis à jour uniquement par le propriétaire des données.
# 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 Reconstruire des index et Analyser des jeux de données.
En cas de propriétaires multiples, il est nécessaire de générer une liste des données de chaque propriétaire et d'exécuter les outils Reconstruire des index et Analyser des jeux de données en se connectant sous chaque nom d'utilisateur.
# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option, the user must be an administrator.
workspace = "Database Connections/user1.sde"
arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", dataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "NO_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 :
- Identifier les utilisateurs connectés
- Envoyer une notification par courrier électronique
- Empêcher la géodatabase d'accepter de nouvelles connexions
- Déconnecter les utilisateurs
- Réconcilier les versions et réinjecter les modifications
- Compressez la géodatabase.
- Autoriser la géodatabase à accepter de nouvelles connexions
- Recréer les index et mettre à jour les statistiques sur les tables système.
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 user names of users currently connected and make email addresses
emailList = [user.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
# Rebuild indexes and analyze the states and states_lineages system tables
arcpy.RebuildIndexes_management(workspace, "SYSTEM", "ALL")
arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", "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.