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?

avrechi
fonte
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 .
Alex Markov
fonte
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
1
Dê uma olhada no módulo subprocesso . Também há boas perguntas aqui: Como chamar comando externo no Python e Executar o comando shell do python e capturar a saída .
AlexMarkov
2
Comando sdemon -o killnão é suficiente. Você deve passar parâmetros adicionais, dê uma olhada no link fornecido .
AlexMarkov
2

Outra possibilidade, desde que você disse que está usando o SDE, é excluir bloqueios compartilhados das tabelas layer_lockse table_locksusando SQL, PL / SQL, T-SQL, etc., por exemplo:

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

Definitivamente, eu não recomendaria essa abordagem em um geodatabase versionado. Veja também: Como os vários mecanismos de bloqueio são implementados no ArcSDE e no geodatabase?

blah238
fonte
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/[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
fonte
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

nickves
fonte