Evitare errori esclusivi di blocco dello schema con ArcPy?


11

Ho uno script per l'aggiornamento di alcune funzionalità sul mio database ogni sera (solo per la copia e la sostituzione di alcune funzionalità). Queste funzionalità sono di "sola lettura". Il mio problema è che non posso evitare che queste funzionalità vengano aperte dagli utenti e il mio script può mostrare il seguente errore:

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

Posso forzare lo script phyton, tramite un comando, copiando i file, persino aperto da qualche utente? Posso rimuovere tutte le connessioni sul mio database prima di eseguire lo script?


1
Questo sembra essere un errore arcpy / arcgisscripting. Conferma quale stai utilizzando e anche quale database stai utilizzando.
blah238,

Risposte:


5

Suppongo che tu stia lavorando con SDE.

Dovresti interrompere tutte le connessioni usando lo sdemonstrumento da riga di comando.

  1. Se sul PC è installato un ArcSDE in cui è in esecuzione uno script, è possibile eseguire sdemon -o killlocalmente per interrompere tutte le connessioni. Dai un'occhiata a questo argomento di aiuto . Non sono sicuro che stia uccidendo le connessioni dirette su 10.0. Ricordo che era una specie di problema su 9.3 e che stava sicuramente uccidendo le connessioni dirette su 10.1.
  2. Se ArcSDE non è installato ed è in esecuzione solo su un server separato, è possibile eseguire questo comando in remoto da Python. C'è qualche discussione in questo argomento .

Sì, sto usando SDE (installato su un server). Ma il comando "sdemon -o kill" ha restituito un errore di sintassi.
avrechi,

Il comando sdemon deve essere eseguito in ArcSDE. Posso metterlo sul mio script Python?
avrechi,


2
Il comando sdemon -o killnon è abbastanza. Dovresti passare parametri aggiuntivi, dai un'occhiata al link fornito .
Alex Markov,


2

Se la preferenza è quella di rimuovere specifici blocchi utente SDE, c'è un modo per farlo tramite arcpy . Preferisco questo approccio perché non richiede di saltare sul server di database per eseguire un comando sde. Posso disconnettere tutti i blocchi indesiderati, quindi eseguire gli aggiornamenti dei dati in un solo script / processo.

L'esempio del link sopra è molto utile:

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)

Ho eseguito questo, e sembrava funzionare, fino a quando non ha colpito il mio ID sessione corrente e ha generato un errore. C'è un modo per scorrere gli utenti e saltare l'utente corrente (se item.Name == 'DBO' e item.ID! = <ID sessione dell'utente corrente>)? Non riesco a trovare un modo per trovare l'ID di sessione dell'utente corrente.
m.Walker

0

Non ho molta familiarità con postgresql ma penso che questo post possa condurti nella giusta direzione:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.