¿Evita el error exclusivo de bloqueo de esquema con ArcPy?

11

Tengo un script para actualizar algunas funciones en mi base de datos todas las noches (solo para copiar y reemplazar algunas funciones). Estas características son de "solo lectura". Mi problema es que no puedo evitar que los usuarios abran estas funciones y mi script puede mostrar el siguiente error:

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

¿Puedo forzar el script phyton, mediante algún comando, copiando los archivos, incluso si algún usuario lo ha abierto? ¿Puedo eliminar todas las conexiones de mi base de datos antes de ejecutar el script?

avrechi
fuente
1
Esto parece ser un error arcpy / arcgisscripting. Confirme cuál está utilizando y también qué base de datos está utilizando.
blah238

Respuestas:

5

Supongo que estás trabajando con SDE.

Debe eliminar todas las conexiones con la sdemonherramienta de línea de comandos.

  1. Si hay un ArcSDE instalado en la PC donde ejecuta el script, puede ejecutarlo sdemon -o killlocalmente para eliminar todas las conexiones. Eche un vistazo a este tema de ayuda . No estoy seguro de si está matando las conexiones directas en 10.0. Recuerdo que fue un tipo de problema en 9.3 y que definitivamente está matando las conexiones directas en 10.1.
  2. Si no tiene instalado ArcSDE y se ejecuta solo en un servidor separado, puede ejecutar este comando de forma remota desde Python. Hay alguna discusión en este tema .
Alex Markov
fuente
Sí, estoy usando SDE (instalado en un servidor). Pero el comando "sdemon -o kill" devolvió un error de sintaxis.
avrechi
El comando sdemon debe ejecutarse en ArcSDE. ¿Puedo ponerlo en mi script de Python?
avrechi
1
Eche un vistazo al módulo de subproceso . También hay buenas preguntas aquí: cómo llamar a un comando externo en Python y ejecutar el comando de shell desde python y capturar la salida .
Alex Markov
2
El comando sdemon -o killno es suficiente. Debe pasar parámetros adicionales, eche un vistazo al enlace proporcionado .
Alex Markov
2

Si la preferencia es eliminar bloqueos de usuario SDE específicos, hay una manera de hacerlo a través de arcpy . Prefiero este enfoque porque no requiere que salte al servidor de la base de datos para ejecutar un comando sde. Puedo desconectar los bloqueos no deseados y luego realizar actualizaciones de datos en un solo script / proceso.

El ejemplo del enlace anterior es muy útil:

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
fuente
Ejecuté esto, y parecía funcionar, hasta que alcanzó mi ID de sesión actual y arrojé un error. ¿Hay alguna forma de recorrer los usuarios y omitir el usuario actual (si item.Name == 'DBO' y item.ID! = <ID de sesión del usuario actual>)? No puedo encontrar una manera de encontrar la ID de sesión del usuario actual.
m
0

No estoy muy familiarizado con postgresql, pero creo que esta publicación puede guiarlo en la dirección correcta:

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

nickves
fuente