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?


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 .

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


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

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/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)

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.