Utilisation de la fonction de création de scripts Python pour la réconciliation par lot 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 réalisé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 vous assurer 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 adapter cet exemple 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 par 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 existantes subsistent.

#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 de Python peut accorder ce délai de 15 minutes aux utilisateurs avant qu’ils 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 des 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.da.ListVersions('C:\\Projects\\MyProject\\admin.sde')

# Execute 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 Reconstruire des index et Analyser des jeux de données à ces fins. Ces outils vous permettent de saisir une liste de jeux de données en entrée et d’exécuter leurs fonctions simultanément sur tous les 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 Reconstruire des index et Analyser des jeux de données tout 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 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-après, ('*.' + userName + '.*') est compatible avec SQL Server, PostgreSQL et DB2. Pour les bases de données 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 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 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']

# 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

Une fois le script terminé, vous pouvez planifier son exécution à des intervalles réguliers et à une heure précise à l’aide du planificateur de tâches du système d’exploitation.

Rubriques connexes