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 Datenbank verbunden ist.

Suchen verbundener Benutzer

Der erste Schritt beim Trennen von Benutzern besteht darin zu bestimmen, wer mit der Datenbank verbunden ist. Dabei wird die Funktion "ListUsers" verwendet, die in einer Administratorverbindung übergeben wird.

# 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 kann diese dazu verwendet werden, um die Benutzer zu benachrichtigen, dass sie die Verbindung 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 Datenbank verbundene Benutzer den gleichen Basisnamen wie seine E-Mail-Adresse aufweist. Dieses Beispiel kann auf einfache Weise geändert werden, um über andere Methoden zum Ermitteln von E-Mail-Adressen zu verfügen.

# get a list of usernames 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

Sobald eine E-Mail-Liste generiert wurde, kann über Python eine E-Mail gesendet werden. 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.

HinweisHinweis:

Weitere Informationen zum smtplib-Modul finden Sie in der Python-Dokumentation unter

http://docs.python.org/.

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 zur Datenbank

Der Workflow zum Blockieren von Verbindungen zur Datenbank über die Skripterstellung beinhaltet die Verwendung der ArcPy-Funktion AcceptingConnections. 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.

#block new connections to the database.
arcpy.AcceptConnections('Database Connections/admin.sde', False)
HinweisHinweis:

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 der Verbindung von Benutzern

Der Workflow zum Trennen von Benutzern über die Skripterstellung beinhaltet die Verwendung der ArcPy-Funktion DisconnectUser. 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")
HinweisHinweis:

Falls alternativ nur die Verbindung bestimmter Benutzer getrennt werden soll, kann die von der ListUsers-Funktion oder dem Dialogfeld der verbundenen Benutzer zurückgegebene ID als Zeichenfolge oder als Python-Liste mit Zeichenfolgen bereitgestellt werden, um die Verbindung der entsprechenden Benutzer zu trennen.

Batch-Abgleich

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 abzugleichen. Es können aber auch nur die Versionen abgeglichen werden, die den Standard verankern. 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.

Weitere Informationen zum Geoverarbeitungswerkzeug "Version abgleichen"

# 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 ist es wichtig, die Datenbank 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')

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 in entsprechenden Systemtabellen auch die Statistiken aktualisiert und die Indizes neu erstellt. Im ersten Schritt dieses Prozesses wird eine Liste mit den Daten abgerufen, deren Eigentümer der Benutzer ist. Indizes und Statistiken können nur vom Eigentümer der Daten oder den Benutzern aktualisiert werden, denen bestimmte Administratorrechte gewährt wurden.

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

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

HinweisHinweis:

Der Einfachheit halber geht dieses Skript davon aus, dass der Administrator (admin) auch der Datenbesitzer ist. Bei mehreren Datenbesitzern muss eine Datenliste für jeden Datenbesitzer generiert und an die Werkzeuge " RebuildIndexes" und "AnalyzeDatasets" übergeben werden.

HinweisHinweis:

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 + '.*')

# Execute rebuild indexes and analyze datasets
# Note: to use the "SYSTEM" option the user must be an administrator.

workspace = "Database Connections/admin.sde"

arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL")

arcpy.AnalyzeDatasets_management(workspace, "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:

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 usernames 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

# 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.
dataList = arcpy.ListTables('*.' + userName + '.*') + arcpy.ListFeatureClasses('*.' + userName + '.*') + arcpy.ListRasters('*.' + userName + '.*')

# Next, for feature datasets get all of the featureclasses
# from the list 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 admin to the rebuild indexes and analyze datasets tools
# Note: to use the "SYSTEM" option the user must be an administrator.
arcpy.RebuildIndexes_management(workspace, "SYSTEM", dataList, "ALL")

arcpy.AnalyzeDatasets_management(workspace, "SYSTEM", dataList, "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.

9/11/2013