- Suchen von verbundenen Benutzern
- Analysieren der Liste der verbundenen Benutzer
- Generieren und Senden einer E-Mail
- Blockieren von Verbindungen mit der Geodatabase
- Anhalten des Skripts
- Trennen von Benutzern
- Batch-Abgleich von Versionen und Zurückschreiben von Änderungen
- Komprimieren der Geodatabase
- Zulassen von Verbindungen mit der Geodatabase
- Erneutes Erstellen von Indizes und Aktualisieren der Statistik
- Vollständiger Code – Beispiel
- Automated scheduling of the script
ArcGIS-Geodatabase-Administratoren können viele Versionsverwaltungs-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. Verwenden Sie die ArcPy-Funktionen ListUsers und DisconnectUser, 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. Geben Sie eine Geodatabase-Administratorverbindung an, 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 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 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)
Anhalten des Skripts
Um den Benutzern ausreichend Zeit zu geben, ihre Arbeit zu beenden, bevor die Verbindung getrennt wird, muss das Skript für einen angegebenen Zeitraum angehalten werden. In diesem Beispiel wird das Zeitmodul in Python verwendet, 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 aller verbleibenden Benutzer getrennt.
#disconnect all users from the database.
arcpy.DisconnectUser('Database Connections/admin.sde', "ALL")
Batch-Abgleich von Versionen und Zurückschreiben von Änderungen
Verwenden Sie das Werkzeug Versionen abgleichen, 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 erzielt eine effektive Komprimierung, da es das gleichzeitige Abgleichen und sofortige Zurückschreiben mehrerer Versionen in entsprechender Reihenfolge ermöglicht. In diesem Beispiel wird das Werkzeug als Geodatabase-Administrator 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('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 (grundlegende) Business-Tabelle 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. Beachten Sie, dass bei der Neuerstellung von Indizes in einigen Datenbankmanagementsystemen die Statistiken ebenfalls aktualisiert werden. Wenn dies für das verwendete Datenbankmanagementsystem zutrifft, müssen Sie die Indizes ebenfalls neu erstellen.
Im ersten Schritt dieses Prozesses wird eine Liste mit den Daten und den Benutzern, denen die Daten gehören, abgerufen. Dies ist erforderlich, da Indizes und Statistiken nur vom Datenbesitzer aktualisiert werden können.
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 featureclasses 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"
Vollständiger Code – Beispiel
Im folgenden Codebeispiel werden alle oben angesprochenen Schritte zusammengeführt, um die folgenden Vorgänge als Geodatabase-Administrator 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 mail
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.")
Automated scheduling of the script
You can schedule to run the complete script at set intervals at a specific time using the operating system's task scheduler.
For instructions on setting up a scheduled task to run on Windows, see Scheduling a Python script to run at prescribed times.