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?

avrechi
źródło
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 .
Alex Markov
źródło
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

Inną możliwością, ponieważ powiedziałeś, że używasz SDE, jest usunięcie współdzielonych blokad z tabel layer_locksi table_locksza pomocą SQL, PL / SQL, T-SQL itp. Np .:

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

Zdecydowanie nie poleciłbym tego podejścia w wersjonowanej geobazie. Zobacz także: W jaki sposób różne mechanizmy blokujące są implementowane w ArcSDE i geobazie?

blah238
źródło
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/[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
źródło
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

nickves
źródło