Verwenden der Python-Skripterstellung zum Batch-Abgleich und Zurückschreiben von Versionen
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 von Versionen auszuführen.
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("Database Connections/admin.sde")
Analysieren der Liste der verbundenen Benutzer
Nach dem Erstellen der Liste verbundener Benutzer können Sie die Benutzer zu 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 zusenden 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 neue Benutzer eine Verbindung mit der Geodatabase herstellen. Vorhandene Verbindungen bestehen weiterhin.
#block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
![Hinweis Hinweis](rsrc/note.png)
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('Database Connections/admin.sde', "ALL")
![Hinweis Hinweis](rsrc/note.png)
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ützt Versionen anderer Benutzer – abgeglichen und zurückgeschrieben werden.
# 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")
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('Database Connections/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('Database Connections/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, denen die Daten gehören, abgerufen. Indizes und Statistiken können nur vom Datenbesitzer aktualisiert werden.
# set the workspace
arcpy.env.workspace = 'Database Connections/admin.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.
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)
![Hinweis Hinweis](rsrc/note.png)
Die verwendeten Platzhaltertoken zur Einschränkung der Datasets der Datenbesitzer variieren je nach Betriebssystem. 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 + '.*'). Für Informix kann der folgende Platzhalter verwendet werden: ('*:' + userName + '.*').
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 und die Werkzeuge Indizes neu erstellen und Datasets analysieren würden während der Verbindung als die einzelnen Benutzer ausgeführt.
# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option, the user must be an administrator.
workspace = "Database Connections/user1.sde"
arcpy.RebuildIndexes_management(workspace, "NO_SYSTEM", dataList, "ALL")
arcpy.AnalyzeDatasets_management(workspace, "NO_SYSTEM", dataList, "ANALYZE_BASE", "ANALYZE_DELTA", "ANALYZE_ARCHIVE")
Vollständiger Code – Beispiel
Im folgenden Beispiel werden alle oben angesprochenen Schritte zusammengeführt, um die folgenden Vorgänge 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 Sie die 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 = 'Database Connections/admin.sde'
# Set a variable for the workspace
workspace = arcpy.env.workspace
# Get a list of connected users.
userList = arcpy.ListUsers("Database Connections/admin.sde")
# Get a list of user names of users currently connected and make email addresses
emailList = [u.Name + "@yourcompany.com" for user in arcpy.ListUsers("Database Connections/admin.sde")]
# 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
server = smtplib.SMTP(SERVER)
server.sendmail(FROM, TO, MESSAGE)
server.quit()
# Block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
# Wait 15 minutes
time.sleep(900)
# Disconnect all users from the database.
arcpy.DisconnectUser('Database Connections/admin.sde', "ALL")
# 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")
# Run the compress tool.
arcpy.Compress_management('Database Connections/admin.sde')
# Allow the database to begin accepting connections again
arcpy.AcceptConnections('Database Connections/admin.sde', True)
# Get a list of datasets owned by the admin user
# 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")
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.
Anweisungen zum Einrichten eines geplanten Tasks zur Ausführung unter Windows finden Sie unter Planen der Ausführung eines Python-Skripts zu bestimmten Zeiten.