Los administradores de geodatabases de ArcGIS pueden utilizar secuencias de comandos de Python para automatizar muchas tareas que normalmente se realizan utilizando varias herramientas de geoprocesamiento. En este tema se explica el proceso que debe seguir un administrador para ejecutar una conciliación nocturna programada de las versiones, una vez que los trabajadores de campo hayan sincronizado las ediciones realizadas en los datos versionados.
Identificar las versiones de geodatabase en función del nombre del servicio
# Create a list of user names that will be used to find versions.
userList = ['???', '###']
# Get a list of versions for the service named '???' and '###' to pass into the ReconcileVersions tool.
versions = arcpy.da.ListVersions('//connectionLocation/admin.sde')
# Create an empty list that will be used to hold version names that we want to reconcile.
verReconcileList = []
# Loop through the versions list to look for versions with appropriate names.
# if these names are found append them to the verReconcileList.
for user in userList:
for version in versions:
if user.lower() in version.name.lower():
verReconcileList.append(version.name)
Conciliar versiones y publicar cambios por lotes
La herramienta Conciliar versiones se puede utilizar para conciliar y publicar todas las versiones en una geodatabase corporativa. Esta herramienta proporciona opciones para conciliar todas las versiones de la geodatabase en una versión de destino (ALL_VERSIONS) o solo las versiones que impiden que la versión de destino se comprima (BLOCKING_VERSIONS). Esta herramienta es un medio para obtener una compresión eficaz, ya que permite conciliar y publicar varias versiones al mismo tiempo en una secuencia adecuada. Tras las operaciones de conciliación o publicación, las versiones también se pueden eliminar proporcionando la palabra clave DELETE_VERSION. En este ejemplo, la herramienta se ejecuta como administrador de la geodatabase. Conectarse como administrador de la geodatabase proporciona capacidad para conciliar y publicar todas las versiones en la geodatabase, incluidas las versiones privadas o protegidas que sean de propiedad de otros usuarios.
# Get a list of versions to pass into the ReconcileVersions tool. versionList = arcpy.ListVersions('//connectionLocation/admin.sde')
# Execute the ReconcileVersions tool.
arcpy.ReconcileVersions_management('//connectionLocation/admin.sde', "ALL_VERSIONS", "sde.DEFAULT", verReconcileList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "KEEP_VERSION", "c:/temp/reconcilelog.txt")
Comprimir la geodatabase
Después de la conciliación y la publicación de los cambios, es importante comprimir la geodatabase para eliminar cualquier información redundante y mover las modificaciones a las tablas de negocio.
# Run the compress tool.
arcpy.Compress_management('//connectionLocation/admin.sde')
Reconstruir índices y actualizar estadísticas
Después de realizar una operación de compresión, se recomienda reconstruir los índices y actualizar las estadísticas. Estos pasos se pueden realizar utilizando las herramientas Reconstruir índices y Analizar datasets. Estas herramientas permiten introducir una lista de datasets y realizar sus funciones en todos los datasets a la vez. Estas herramientas también actualizan las estadísticas y regeneran los índices de las tablas de sistema pertinentes cuando se ejecutan como administrador de la geodatabase. La primera parte del proceso consiste en obtener una lista de datos y de los usuarios que son propietarios de ellos. Solo el propietario de los datos puede actualizar los índices y las estadísticas.
# set the workspace arcpy.env.workspace = '//connectionLocation/dataOwner.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. oDataList = 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 + '.*'):
oDataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
Una vez que se identifica la lista de los datos que son propiedad del usuario, puede procesarse con las herramientas Reconstruir índices y Analizar datasets.
Si hay más de un propietario de datos, es necesario generar una lista de datos para cada uno de ellos y es necesario ejecutar las herramientas Reconstruir índices y Analizar datasets mientras se está conectado como cada uno de los usuarios.
# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option, the user must be an administrator.
workspace = "//connectionLocation/user1.sde"
arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", oDataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", oDataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
Eliminar versiones que una réplica ya no utilice como referencia
# set the workspace workspace = '//connectionLocation/admin.sde'
# Get a list of all the replica versions in the geodatabase replicaVersions = [replica.version for replica in arcpy.da.ListReplicas(workspace)]
# Loop through this replica version list and remove these version names from the list of versions we reconciled earlier. # We want to remove versions from this list that are still being referenced by a replica for replicaVer in replicaVersions:
if replicaVer in verReconcileList:
verReconcileList.remove(replicaVer)
# Loop through the verReconcileList and delete versions.
# These versions are no longer being referenced by a replica so we can assume it's safe to delete them. if len(versionsList) > 0:
for version in verReconcileList:
arcpy.DeleteVersion_management(workspace, version)
Ejemplo de código completo
El siguiente ejemplo de código pone todas las piezas anterior juntas para realizar las siguientes operaciones:
- Identifique las versiones de geodatabase.
- Conciliar versiones y publicar cambios.
- Comprima la geodatabase.
- Reconstruir los índices y actualizar las estadísticas en las tablas del sistema.
- Reconstruya los índices y actualice las estadísticas en las tablas de usuarios.
import arcpy
try:
# Set the workspace
arcpy.env.workspace = 'Database Connections/admin.sde'
# Set variables
workspace = arcpy.env.workspace
arcpy.env.overwriteOutput = True
targetVersion = 'sde.DEFAULT'
# Create a list of user names that will be used to find versions.
userList = ['???', '###']
# Get a list of versions for the service named '???' and '###' to pass into the ReconcileVersions tool.
versions = arcpy.da.ListVersions(workspace)
# Create an empty list that will be used to hold version names that we want to reconcile.
verReconcileList = []
# Loop through the list to look for versions with our user names in their name where the parent version is the target version.
# if these names are found append them to the verReconcileList.
for user in userList:
for version in versions:
if user.lower() in version.name.lower():
if version.parentVersionName.lower() == targetVersion.lower():
verReconcileList.append(version.name)
# Perform maintenance if versions are found, otherwise there is no maintenance to perform.
if len(verReconcileList)>0:
# Execute the ReconcileVersions tool.
arcpy.ReconcileVersions_management(workspace, "ALL_VERSIONS", targetVersion, verReconcileList, "LOCK_ACQUIRED", "NO_ABORT", "BY_OBJECT", "FAVOR_TARGET_VERSION", "POST", "KEEP_VERSION", "c:/temp/reconcilelog.txt")
# Run the compress tool.
arcpy.Compress_management(workspace)
# 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")
'''
*********************
Data Owner(s) Section
*********************
'''
# Get a list of datasets owned by the data owner user (requires second connection file)
# Set the workspace
arcpy.env.workspace = 'Database Connections/dataOwner.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(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.
oDataList = 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 + '.*'):
oDataList += arcpy.ListFeatureClasses(feature_dataset=dataset)
# Rebuild indexes and analyze the data owner tables
arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", oDataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", oDataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
'''
*************************
End Data Owner(s) Section
*************************
'''
# set the workspace back to the admin workspace
workspace = 'Database Connections/admin.sde'
# Get a list of all the replica versions in the geodatabase
replicaVersions = [replica.version for replica in arcpy.da.ListReplicas(workspace)]
'''
- We now have a list of versions that were created by taking a map offline (verReconcileList)
- We also have a list of replica versions (replicaVersions)
- The versions that we were reconciling are ready to be deleted if they are not currently pointing to a version
- We are going to loop through the reconcile versions list and remove any versions that are still pointing to a replica
- The versions remaining in the reconcile list are ready to be cleaned (deleted) up because there are no maps/replicas pointing to them.
'''
# Using the list of versions associated with users/maps that we reconciled earlier. Remove any versions from the list that are still being used by a replica.
for replicaVer in replicaVersions:
if replicaVer in verReconcileList:
verReconcileList.remove(replicaVer)
# Loop through the versionsList and delete versions that are no longer being referenced by a replica.
# Since these versions are no longer being referenced by a replica we can assume it's safe to delete them.
if len(verReconcileList) > 0: #check to see that the list is not empty
for version in verReconcileList:
try:
arcpy.DeleteVersion_management(workspace, version)
except:
print("Failed to delete version.")
print(arcpy.GetMessages(2))
else:
print("No versions to delete.")
else:
print("No versions to reconcile, aborting version maintenance routine.")
except:
print(arcpy.GetMessages(2))
print("Done.")