Utilisation de la fonction de création de scripts Python pour la réconciliation par lots et la réinjection des versions traditionnelles

Disponible avec une licence Standard ou Advanced.

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 traditionnelles planifiée, exécutée de nuit.

Remarque :

Ce workflow est spécifique du versionnement traditionnel. Le versionnement de branche ne contient pas de tables des ajouts ou des suppressions comme le versionnement traditionnel et ne requiert donc pas les tâches d’administration décrites dans cette rubrique.

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. Vous pouvez 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("C:\\Projects\\MyProject\\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. Vous pouvez modifier cet exemple de façon à inclure d’autres méthodes permettant de déterminer les 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é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 continuent d’exister.

#block new connections to the database.
arcpy.AcceptConnections('C:\\Projects\\MyProject\\admin.sde', False)
Remarque :

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.

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. Vous pouvez utiliser le module temporel dans Python pour 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('C:\\Projects\\MyProject\\admin.sde', "ALL")
Remarque :

Pour déconnecter uniquement des utilisateurs spécifiques, fournissez une chaîne ou une liste Python de chaînes des ID de connexion de ces connexions utilisateur. Ces identifiants sont renvoyés par la fonction ListUsers.

Réconcilier par lot les versions et réinjecter les modifications

Vous pouvez utiliser l’outil Réconcilier les versions pour 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.da.ListVersions('C:\\Projects\\MyProject\\admin.sde')

# Run the ReconcileVersions tool.
arcpy.ReconcileVersions_management('C:\\Projects\\MyProject\\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('C:\\Projects\\MyProject\\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('C:\\Projects\\MyProject\\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. Utilisez les outils Recréer les index et Analyser des jeux de données pour effectuer ces opérations. Ces outils vous permettent de saisir une liste de jeux de données en entrée et exécutent 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, puis à mettre à jour les index et statistiques en tant que 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 Recréer les 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 username 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 feature classes and add them to the primary 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"
Remarque :

Les jetons de caractères génériques utilisés pour limiter les jeux de données appartenant à l'utilisateur dépendent de la base de données. Dans l’exemple ci-dessus, ('*.' + userName + '.*') fonctionne pour SQL Server, PostgreSQL ou DB2. Dans le cas d’Oracle, vous pouvez utiliser le caractère générique suivant : (userName + '.*').

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 usernames 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 email.
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.da.ListVersions(adminConn)
versionList = [ver.name for ver in verList if ver.parentVersionName == 'sde.DEFAULT']

# Run 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

Une fois exécuté, un script peut être réexécuté à des intervalles et à une heure spécifiques. Vous pouvez planifier cette réexécution à l’aide du planificateur de tâches du système d’exploitation.

Rubriques connexes