Unikanie wyłącznego błędu blokady schematu w ArcPy?


11

Mam skrypt aktualizujący niektóre funkcje w mojej bazie danych każdej nocy (tylko do kopiowania i zastępowania niektórych funkcji). Te funkcje są „tylko do odczytu”. Mój problem polega na tym, że nie mogę uniknąć otwarcia tych funkcji przez użytkowników, a mój skrypt może wyświetlać następujący błąd:

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

Czy mogę wymusić skrypt phyton, za pomocą jakiegoś polecenia, kopiując pliki, nawet otwarte przez jakiegoś użytkownika? Czy mogę usunąć wszystkie połączenia z mojej bazy danych przed uruchomieniem skryptu?


1
To wydaje się być błędem arcpy / arcgisscripting. Potwierdź, którego używasz, a także jakiej bazy danych używasz.
blah238,

Odpowiedzi:


5

Przypuszczam, że pracujesz z SDE.

Powinieneś zabić wszystkie połączenia za pomocą sdemonnarzędzia wiersza poleceń.

  1. Jeśli na komputerze jest zainstalowany ArcSDE, na którym jest uruchomiony skrypt, możesz uruchomić sdemon -o killlokalnie, aby zabić wszystkie połączenia. Spójrz na ten temat pomocy . Nie jestem pewien, czy zabija bezpośrednie połączenia na 10.0. Pamiętam, że był to pewien problem na 9.3 i że zdecydowanie zabija bezpośrednie połączenia na 10.1.
  2. Jeśli nie masz zainstalowanego ArcSDE i działa on tylko na oddzielnym serwerze, możesz wykonać to polecenie zdalnie z poziomu Pythona. W tym temacie jest trochę dyskusji .

Tak, używam SDE (zainstalowanego na serwerze). Ale polecenie „sdemon -o kill” zwróciło błąd składniowy.
avrechi

Polecenie sdemon należy wykonać w ArcSDE. Czy mogę umieścić go w skrypcie Python?
avrechi


2
Dowodzenie sdemon -o killto za mało. Powinieneś przekazać dodatkowe parametry, spójrz na podany link .
Alex Markov


2

Jeśli preferowane jest usunięcie określonych blokad użytkownika SDE, istnieje sposób, aby to zrobić za pomocą arcpy . Wolę to podejście, ponieważ nie wymaga ono przeskoczenia na serwer bazy danych w celu wykonania polecenia sde. Mogę odłączyć wszelkie niechciane blokady, a następnie wykonać aktualizacje danych w jednym skrypcie / procesie.

Przykład z powyższego linku jest bardzo przydatny:

import arcpy

admin_workspace = "Database Connections/tenone@sde.sde"
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)

Uruchomiłem to i wydawało się, że działa, dopóki nie uderzyło w mój bieżący identyfikator sesji i zgłosił błąd. Czy istnieje sposób na przechodzenie między użytkownikami i pomijanie bieżącego użytkownika (jeśli item.Name == 'DBO' i item.ID! = <Identyfikator sesji bieżącego użytkownika>)? Nie mogę znaleźć sposobu na znalezienie identyfikatora sesji bieżącego użytkownika.
m.Walker,

0

Nie jestem zbyt obeznany z postgresql, ale myślę, że ten post może doprowadzić cię we właściwym kierunku:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.