Vermeiden Sie exklusive Schemasperrfehler mit ArcPy?

11

Ich habe ein Skript zum Aktualisieren einiger Funktionen in meiner Datenbank jeden Abend (nur zum Kopieren und Ersetzen einiger Funktionen). Diese Funktionen sind "schreibgeschützt". Mein Problem ist, dass ich nicht vermeiden kann, dass diese Funktionen von Benutzern geöffnet werden, und mein Skript den folgenden Fehler anzeigen kann:

ExecuteError: ERROR 000464: Cannot get exclusive schema lock. 
              Either being edited or in use by another application.

Kann ich das Phyton-Skript über einen Befehl erzwingen, indem ich die Dateien kopiere, die sogar von einem Benutzer geöffnet wurden? Kann ich alle Verbindungen in meiner Datenbank trennen, bevor ich das Skript ausführe?

avrechi
quelle
1
Dies scheint ein Arcpy / Arcgisscripting-Fehler zu sein. Bitte bestätigen Sie, welche Sie verwenden und welche Datenbank Sie verwenden.
blah238

Antworten:

5

Ich nehme an, Sie arbeiten mit SDE.

Sie sollten alle Verbindungen mit dem sdemonBefehlszeilentool beenden.

  1. Wenn auf dem PC ein ArcSDE installiert ist, auf dem Sie das Skript ausführen, können Sie es sdemon -o killlokal ausführen , um alle Verbindungen zu beenden. Schauen Sie sich dieses Hilfethema an . Ich bin nicht sicher, ob es Direktverbindungen auf 10.0 beendet. Ich erinnere mich, dass es in 9.3 eine Art Problem war und dass es in 10.1 definitiv direkte Verbindungen beendet.
  2. Wenn Sie ArcSDE nicht installiert haben und es nur auf einem separaten Server ausgeführt wird, können Sie diesen Befehl remote von Python aus ausführen. Es gibt einige Diskussionen in diesem Thema .
Alex Markov
quelle
Ja, ich verwende SDE (auf einem Server installiert). Der Befehl "sdemon -o kill" gab jedoch einen Syntaxfehler zurück.
Avrechi
Der Befehl sdemon muss in ArcSDE ausgeführt werden. Kann ich es in mein Python-Skript einfügen?
Avrechi
2
Befehl sdemon -o killist nicht genug. Sie sollten zusätzliche Parameter übergeben und sich den bereitgestellten Link ansehen .
Alex Markov
2

Eine andere Möglichkeit, da Sie angegeben haben, dass Sie SDE verwenden, besteht darin, gemeinsam genutzte Sperren mit SQL, PL / SQL, T-SQL usw. aus den Tabellen layer_locksund zu löschen table_locks. Beispiel:

DELETE FROM TABLE_LOCKS WHERE SDE_ID = :b1 AND REGISTRATION_ID = :b2

Ich würde diesen Ansatz auf keinen Fall für eine versionierte Geodatabase empfehlen. Siehe auch: Wie sind die verschiedenen Sperrmechanismen in ArcSDE und der Geodatabase implementiert?

blah238
quelle
2

Wenn bestimmte SDE-Benutzersperren bevorzugt entfernt werden sollen, gibt es eine Möglichkeit, dies über arcpy zu tun . Ich bevorzuge diesen Ansatz, da Sie nicht auf den Datenbankserver springen müssen, um einen sde-Befehl auszuführen. Ich kann unerwünschte Sperren aufheben und dann Datenaktualisierungen in einem Skript / Prozess durchführen.

Beispiel aus dem obigen Link ist sehr nützlich:

import arcpy

admin_workspace = "Database Connections/[email protected]"
arcpy.env.workspace = admin_workspace
user_name = "GDB"

# Look through the users in the connected user list and get the SDE ID.
# Use the SDE ID to disconnect the user that matches the username variable
users = arcpy.ListUsers() # The environment is set, no workspace is needed.
for item in users:
    if item.Name == user_name:
        arcpy.DisconnectUser(admin_workspace, item.ID)
J Graham
quelle
Ich habe dies ausgeführt und schien zu funktionieren, bis es meine aktuelle Sitzungs-ID traf und einen Fehler auslöste. Gibt es eine Möglichkeit, Benutzer zu durchlaufen und den aktuellen Benutzer zu überspringen (wenn item.Name == 'DBO' und item.ID! = <Sitzungs-ID des aktuellen Benutzers>)? Ich kann die Sitzungs-ID des aktuellen Benutzers nicht finden.
m.Walker
0

Ich bin mit postgresql nicht sehr vertraut, aber ich denke, dieser Beitrag kann Sie in die richtige Richtung führen:

/programming/5108876/kill-a-postgresql-session-connection

Nickves
quelle