- 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 des tâches d'administration de versions 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. Utilisez 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. Indiquez 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êche 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 le délai imparti, afin de permettre aux utilisateurs de terminer leur tâche en cours avant de se déconnecter. Dans cet exemple, le module temporel de Python sert à accorder un 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 tous les utilisateurs restants 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
Utilisez l'outil Réconcilier les versions pour 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 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 (de base).
# 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. Notez que dans certains systèmes de gestion de bases de données, la recréation des index met également à jour les statistiques. Si le système de gestion de base de données que vous utilisez opère de la sorte, vous devez uniquement recréer les index.
La première partie de ce processus consiste à obtenir une liste des données et des utilisateurs qui possèdent ces données. Ceci est nécessaire, car les index et statistiques peuvent être mis à jour uniquement par le propriétaire des données.
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.
# set the workspace
arcpy.env.workspace = "C:\\Projects\\MyProject\\user1.sde"
# Set a variable for the workspace
workspace = arcpy.env.workspace
# 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(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)
# Pass in the list of datasets owned by the connected user to the rebuild indexes
# and update statistics on the data tables
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 en tant qu'administrateur de géodatabase :
- 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
- Compresser 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 = 'C:\\Projects\\MyProject\\admin.sde'
# Set a variable for the workspace
adminConn = arcpy.env.workspace
# Get a list of connected users.
userList = arcpy.ListUsers(adminConn)
# Get a list of user names of users currently connected and make email addresses
emailList = [user.Name + "@yourcompany.com" for user in arcpy.ListUsers(adminConn)]
# 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
print("Sending email to connected users")
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, MESSAGE)
server.quit()
# Block new connections to the database.
print("The database is no longer accepting connections")
arcpy.AcceptConnections(adminConn, False)
# Wait 15 minutes
time.sleep(900)
# Disconnect all users from the database.
print("Disconnecting all users")
arcpy.DisconnectUser(adminConn, "ALL")
# Get a list of versions to pass into the ReconcileVersions tool.
# Only reconcile versions that are children of Default
print("Compiling a list of versions to reconcile")
verList = arcpy.ListVersions(adminConn)
versionList = [ver.name for ver in verList if ver.parentVersionName == 'sde.DEFAULT']
# Execute the ReconcileVersions tool.
print("Reconciling all versions")
arcpy.ReconcileVersions_management(adminConn, "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.
print("Running compress")
arcpy.Compress_management(adminConn)
# Allow the database to begin accepting connections again
print("Allow users to connect to the database again")
arcpy.AcceptConnections(adminConn, True)
# Update statistics and indexes for the system tables
# Note: to use the "SYSTEM" option the user must be an geodatabase or database administrator.
# Rebuild indexes on the system tables
print("Rebuilding indexes on the system tables")
arcpy.RebuildIndexes_management(adminConn, "SYSTEM")
# Update statistics on the system tables
print("Updating statistics on the system tables")
arcpy.AnalyzeDatasets_management(adminConn, "SYSTEM")
print("Finished.")
Planification automatisée du script
Vous pouvez réexécuter le script complet à 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.