Evitando erro exclusivo de bloqueio de esquema com o ArcPy?


11

Eu tenho um script para atualizar alguns recursos no meu banco de dados todas as noites (apenas para copiar e substituir alguns recursos). Este recurso é "somente leitura". Meu problema é que não posso evitar que esses recursos sejam abertos pelos usuários e meu script pode mostrar o seguinte erro:

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

Posso forçar o script phyton, através de algum comando, copiando os arquivos, mesmo sendo aberto por algum usuário? Posso derrubar todas as conexões no meu banco de dados antes de executar o script?


1
Parece ser um erro arcpy / arcgisscripting. Por favor, confirme qual você está usando e também qual banco de dados você está usando.
precisa saber é o seguinte

Respostas:


5

Suponho que você esteja trabalhando com a SDE.

Você deve matar todas as conexões usando sdemona ferramenta de linha de comando.

  1. Se houver um ArcSDE instalado no PC em que você esteja executando o script, poderá executar sdemon -o killlocalmente para eliminar todas as conexões. Dê uma olhada neste tópico de ajuda . Não tenho certeza se está matando conexões diretas no 10.0. Lembro que era um tipo de problema na 9.3 e que definitivamente está matando conexões diretas na 10.1.
  2. Se você não possui o ArcSDE instalado e ele está sendo executado apenas em um servidor separado, você pode executar este comando remotamente no Python. Há alguma discussão neste tópico .

Sim, estou usando o SDE (instalado em um servidor). Mas o comando "sdemon -o kill" retornou um erro de sintaxe.
Avrechi

O comando sdemon deve ser executado no ArcSDE. Posso colocá-lo no meu script Python?
avrechi


2
Comando sdemon -o killnão é suficiente. Você deve passar parâmetros adicionais, dê uma olhada no link fornecido .
AlexMarkov


2

Se a preferência é remover bloqueios de usuário SDE específicos, existe uma maneira de fazer isso via arcpy . Prefiro essa abordagem porque não exige que você pule no servidor de banco de dados para executar um comando sde. Posso desconectar qualquer bloqueio indesejado e executar atualizações de dados em um único script / processo.

O exemplo do link acima é muito útil:

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)

Eu executei isso e pareceu funcionar, até atingir meu ID da sessão atual e gerar um erro. Existe uma maneira de percorrer os usuários e pular o usuário atual (se item.Name == 'DBO' e item.ID! = <ID da sessão do usuário atual>)? Não consigo encontrar uma maneira de encontrar o ID da sessão do usuário atual.
precisa saber é o seguinte

0

Não estou muito familiarizado com o postgresql, mas acho que este post pode levá-lo à direção certa:

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.