Verwenden der Python-Skripterstellung zum Abgleichen und Zurückschreiben von traditionellen Versionen im Batch-Verfahren

ArcGIS-Geodatabase-Administratoren können viele Tasks, die normalerweise mit verschiedenen Geoverarbeitungswerkzeugen durchgeführt werden, mithilfe der Python-Skripterstellung automatisieren. In diesem Thema wird der Prozess erläutert, den ein Administrator möglicherweise durchführt, um einen geplanten nächtlichen Abgleich traditioneller Versionen auszuführen.

Hinweis:

Dieser Workflow gilt speziell für die traditionelle Versionierung. Da es bei der Verzweigungsversionierung keine Adds- und Deletes-Tabellen wie bei der traditionellen Versionierung gibt, sind viele der in diesem Thema beschriebenen Verwaltungsaufgaben nicht erforderlich.

Viele Administratoren möchten sicherstellen, dass keine anderen mit der Datenbank verbundenen Benutzer vorhanden sind, wenn sie einen Abgleich ausführen. Die ArcPy-Funktionen ListUsers und DisconnectUser können verwendet werden, um sicherzustellen, dass nur der Administrator mit der Geodatabase verbunden ist.

Suchen von verbundenen Benutzern

Verwenden Sie zunächst die Funktion ListUsers, um zu bestimmen, wer mit der Geodatabase verbunden ist. Sie müssen eine Geodatabase-Administratorverbindung angeben, um die Funktion ListUsers auszuführen.

# Get a list of connected users.
userList = arcpy.ListUsers("C:\\Projects\\MyProject\\admin.sde")

Analysieren der Liste der verbundenen Benutzer

Nach dem Erstellen der Liste verbundener Benutzer können Sie die Benutzer benachrichtigen, dass sie die Verbindung mit der Geodatabase trennen müssen. Dies kann erreicht werden, indem eine Liste der Benutzer inklusive ihrer zugeordneten E-Mail-Adressen abgerufen wird.

Der Einfachheit halber wird in diesem Beispiel davon ausgegangen, dass jeder mit der Geodatabase verbundene Benutzer den gleichen Basisnamen wie seine E-Mail-Adresse aufweist. Dieses Beispiel kann geändert werden, um über andere Methoden zum Ermitteln von E-Mail-Adressen zu verfügen.

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

Generieren und Senden einer E-Mail

Verwenden Sie die E-Mail-Liste, um E-Mails an die Benutzer von Python zu senden und sie zu informieren, dass sie die Verbindung mit der Geodatabase trennen müssen. In diesem Beispiel wird das smtplib-Modul von Python verwendet. Es gibt aber auch andere Optionen zum Senden von E-Mails über nicht dem Standard entsprechende Module.

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()

Blockieren von Verbindungen mit der Geodatabase

Verwenden Sie die ArcPy-Funktion AcceptConnections, um Verbindungen mit der Geodatabase durch Skripte zu blockieren. Diese Funktion ist nur über die Python-Skripterstellung verfügbar.

So wird verhindert, dass weitere Benutzer eine Verbindung mit der Geodatabase herstellen. Vorhandene Verbindungen bestehen weiterhin.

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

Es ist nicht erforderlich, die Verbindungen zur Datenbank zu blockieren oder alle Benutzer zu trennen, um diese Wartungsaufgabe durchzuführen. Wenn ein Trennen aller Verbindungen in Ihrem Unternehmen möglich ist, kann der Komprimierungsprozess unter Umständen effizienter sein.

Anhalten des Skripts

Um den Benutzern ausreichend Zeit zu geben, ihre Arbeit zu beenden, bevor die Verbindung getrennt wird, muss das Skript für 15 Minuten angehalten werden. Das Zeitmodul in Python kann verwendet werden, um eine Kulanzzeit von 15 Minuten zu gewähren, bevor die Verbindung der verbundenen Benutzer getrennt wird.

import time
time.sleep(900)#time is specified in seconds

Trennen von Benutzern

Verwenden Sie die ArcPy-Funktion DisconnectUser, um die Verbindung von Benutzern durch Skripte zu trennen. Diese Funktion ist nur über die Python-Skripterstellung verfügbar.

Nachdem die Benutzer benachrichtigt wurden und das Skript 15 Minuten lang angehalten wurde, wird die Verbindung der Benutzer getrennt.

#Disconnect all users from the database.
arcpy.DisconnectUser('C:\\Projects\\MyProject\\admin.sde', "ALL")
Hinweis:

Wenn nur bestimmte Benutzer getrennt werden sollen, geben Sie eine Zeichenfolge oder Python-Zeichenfolgenliste der Verbindungs-IDs für diese Benutzerverbindungen an. Diese IDs werden von der Funktion ListUsers zurückgegeben.

Batch-Abgleich von Versionen und Zurückschreiben von Änderungen

Das Werkzeug Version abgleichen kann verwendet werden, um alle Versionen in einer Enterprise-Geodatabase abzugleichen und zurückzuschreiben. Dieses Werkzeug stellt Optionen bereit, um alle Versionen in der Geodatabase mit einer Zielversion (ALL_VERSIONS) abzugleichen. Es können aber auch nur die Versionen abgeglichen werden, die die Komprimierung der Zielversion verhindern (BLOCKING_VERSIONS). Dieses Werkzeug ist ein Mittel, um eine effektive Komprimierung zu erreichen, da es das gleichzeitige Abgleichen und sofortige Zurückschreiben mehrerer Versionen in entsprechender Reihenfolge ermöglicht. In diesem Beispiel wird das Werkzeug als Geodatabase-Administrators ausgeführt. Indem eine Verbindung als Geodatabase-Administrator hergestellt wird, können alle Versionen in der Geodatabase – selbst private oder geschützte Versionen anderer Benutzer – abgeglichen und zurückgeschrieben werden.

# Get a list of versions to pass into the ReconcileVersions tool. versionList = arcpy.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")

Komprimieren der Geodatabase

Nach dem Abgleichen und Zurückschreiben der Änderungen ist es wichtig, die Geodatabase zu komprimieren, um überflüssige Informationen zu entfernen und die Änderungen in die Business-Tabellen zu verschieben.

# Run the compress tool. 
arcpy.Compress_management('C:\\Projects\\MyProject\\admin.sde')

Zulassen von Verbindungen mit der Geodatabase

Nachdem Sie den Abgleich und das Zurückschreiben von Versionen beendet und die Geodatabase komprimiert haben, können Sie zulassen, dass Benutzer eine Verbindung herstellen.

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

Erneutes Erstellen von Indizes und Aktualisieren der Statistik

Nach dem Durchführen eines Komprimierungsvorgangs empfiehlt es sich, die Indizes neu zu erstellen und die Statistiken zu aktualisieren. Diese Schritte können mit den Werkzeugen Indizes neu erstellen und Datasets analysieren durchgeführt werden. Diese Werkzeuge ermöglichen die Eingabe einer Liste mit Eingabe-Datasets und das gleichzeitige Durchführen ihrer Funktionen bei allen Datasets. Mit diesen Werkzeugen werden außerdem Statistiken aktualisiert und Indizes für entsprechende Systemtabellen neu erstellt, wenn sie als Geodatabase-Administrator ausgeführt werden. Im ersten Schritt dieses Prozesses wird eine Liste mit den Daten und den Benutzern abgerufen, denen die Daten gehören. Anschließend werden die Indizes und Statistiken als Datenbesitzer aktualisiert.

Sobald die Liste der Daten abgerufen wurde, deren Besitzer der Benutzer ist, kann diese an die Werkzeuge Indizes neu erstellen und Datasets analysieren übergeben werden.

Bei mehreren Datenbesitzern muss eine Datenliste für jeden Datenbesitzer generiert werden, wobei die Werkzeuge Indizes neu erstellen und Datasets analysieren während der Verbindung als die einzelnen Benutzer ausgeführt werden.

# 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 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"
Hinweis:

Die verwendeten Platzhaltertoken zur Einschränkung der Datasets der Datenbesitzer sind datenbankspezifisch. In dem oben aufgeführten Beispiel kann ('*.' + userName + '.*') für SQL Server, PostgreSQL oder DB2 verwendet werden. Für Oracle kann der folgende Platzhalter verwendet werden: (userName + '.*').

Vollständiger Code – Beispiel

Im folgenden Codebeispiel werden alle oben angesprochenen Schritte zusammengeführt, um die folgenden Vorgänge als Geodatabase-Administrator-Benutzer durchzuführen:

  • Identifizieren verbundener Benutzer
  • Senden einer E-Mail-Benachrichtigung
  • Verhindern des Akzeptierens neuer Verbindungen durch die Geodatabase
  • Trennen von Benutzern
  • Batch-Abgleich von Versionen und Zurückschreiben von Änderungen
  • Komprimieren der Geodatabase
  • Zulassen des Akzeptierens neuer Verbindungen durch die Geodatabase
  • Erneutes Erstellen von Indizes und Aktualisieren der Statistik in Systemtabellen
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.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.")

Automatisiertes Planen des Skripts

Nach dem Vervollständigen des Skripts kann dessen Ausführung mit der Task-Planung des Betriebssystems so geplant werden, dass es nach festen Intervallen zu einem bestimmten Zeitpunkt ausgeführt wird.