Vous évitez l'erreur de verrouillage de schéma exclusif avec ArcPy?

11

J'ai un script pour mettre à jour certaines fonctionnalités de ma base de données tous les soirs (juste pour copier et remplacer certaines fonctionnalités). Ces fonctionnalités sont en "lecture seule". Mon problème est que je ne peux pas éviter que ces fonctionnalités soient ouvertes par les utilisateurs, et mon script peut afficher l'erreur suivante:

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

Puis-je forcer le script phyton, via une commande, en copiant les fichiers, même ouvert par un utilisateur? Puis-je supprimer toutes les connexions de ma base de données avant d'exécuter le script?

avrechi
la source
1
Cela semble être une erreur arcpy / arcgisscripting. Veuillez confirmer laquelle vous utilisez, ainsi que la base de données que vous utilisez.
blah238

Réponses:

5

Je suppose que vous travaillez avec SDE.

Vous devez tuer toutes les connexions à l'aide de l' sdemonoutil de ligne de commande.

  1. S'il y a un ArcSDE installé sur PC sur lequel vous exécutez le script, vous pouvez exécuter sdemon -o killlocalement pour supprimer toutes les connexions. Jetez un œil à cette rubrique d'aide . Je ne suis pas sûr que cela tue les connexions directes sur 10.0. Je me souviens que c'était une sorte de problème sur 9.3 et qu'il tuait définitivement les connexions directes sur 10.1.
  2. Si ArcSDE n'est pas installé et qu'il s'exécute uniquement sur un serveur distinct, vous pouvez exécuter cette commande à distance à partir de Python. Il y a une discussion dans ce sujet .
Alex Markov
la source
Oui, j'utilise SDE (installé sur un serveur). Mais la commande "sdemon -o kill" a renvoyé une erreur de syntaxe.
avrechi
La commande sdemon doit être exécutée dans ArcSDE. Puis-je le mettre sur mon script Python?
avrechi
1
Jetez un œil au module de sous-processus . Il y a aussi de belles questions ici: comment appeler une commande externe en Python et exécuter la commande shell à partir de python et capturer la sortie .
Alex Markov
2
La commande sdemon -o killne suffit pas. Vous devez passer des paramètres supplémentaires, jetez un œil au lien fourni .
Alex Markov
2

Une autre possibilité puisque vous avez dit que vous utilisez SDE est de supprimer les verrous partagés des tables layer_lockset en table_locksutilisant SQL, PL / SQL, T-SQL, etc. Par exemple:

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

Je ne recommanderais certainement pas cette approche sur une géodatabase versionnée. Voir aussi: Comment les différents mécanismes de verrouillage sont-ils implémentés dans ArcSDE et la géodatabase?

blah238
la source
2

Si la préférence est de supprimer des verrous utilisateur SDE spécifiques, il existe un moyen de le faire via arcpy . Je préfère cette approche car elle ne nécessite pas que vous sautiez sur le serveur de base de données pour exécuter une commande sde. Je peux déconnecter tous les verrous indésirables, puis effectuer des mises à jour de données en un seul script / processus.

L'exemple du lien ci-dessus est très utile:

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
la source
J'ai exécuté cela et j'ai semblé fonctionner jusqu'à ce qu'il atteigne mon ID de session actuel et génère une erreur. Existe-t-il un moyen de parcourir les utilisateurs et de sauter l'utilisateur actuel (si item.Name == 'DBO' et item.ID! = <ID de session de l'utilisateur actuel>)? Je ne trouve aucun moyen de trouver l'ID de session de l'utilisateur actuel.
m.Walker
0

Je ne connais pas très bien postgresql mais je pense que ce post peut vous conduire dans la bonne direction:

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

nickves
la source