Уникає виключної помилки блокування схеми за допомогою ArcPy?


11

У мене є сценарій для оновлення деяких функцій у моїй базі даних щовечора (лише для копіювання та заміни деяких функцій). Ці функції "лише для читання". Моя проблема полягає в тому, що я не можу уникнути того, що ці функції відкриваються користувачами, і мій сценарій може відображати таку помилку:

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

Чи можу я змусити фито-скрипт за допомогою якоїсь команди, копіюючи файли, навіть хтось користувач відкрив? Чи можу я зняти всі підключення до моєї бази даних перед запуском сценарію?


1
Це, мабуть, є помилкою arcpy / arcgiscripting. Підтвердьте, яку ви використовуєте, а також яку базу даних ви використовуєте.
blah238

Відповіді:


5

Я припускаю, що ви працюєте з SDE.

Ви повинні вбити всі з'єднання за sdemonдопомогою інструменту командного рядка.

  1. Якщо на ПК встановлений ArcSDE, де ви виконуєте сценарій, ви можете виконати sdemon -o killлокально, щоб знищити всі з'єднання. Погляньте на цю довідкову тему . Я не впевнений, це вбиває прямі з'єднання на 10.0. Я пам’ятаю, що це була певна проблема на 9.3 і що вона напевно вбиває прямі з'єднання 10.1.
  2. Якщо у вас не встановлено ArcSDE, і він працює лише на окремому сервері, ви можете виконати цю команду віддалено від Python. У цій темі є певна дискусія .

Так, я використовую SDE (встановлений на сервері). Але команда "sdemon -o kill" повернула синтаксичну помилку.
avrechi

Команда sdemon повинна бути виконана в ArcSDE. Чи можу я поставити його на свій скрипт Python?
avrechi


2
Команди sdemon -o killнедостатньо. Вам слід пройти додаткові параметри, перегляньте надане посилання .
Олексій Марков

2

Ще одна можливість, оскільки ви сказали, що використовуєте SDE, - видалити спільні блокування з таблиць layer_locksта table_locksтаблиць за допомогою SQL, PL / SQL, T-SQL тощо. Наприклад:

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

Я б точно не рекомендував цей підхід на базі геоданих. Дивіться також: Як реалізуються різні механізми блокування в ArcSDE та базі даних геоданих?


2

Якщо перевагою є видалення конкретних блоків користувачів SDE, є спосіб зробити це за допомогою arcpy . Я віддаю перевагу такому підходу, оскільки він не вимагає переходу на сервер бази даних для виконання команди sde. Я можу відключити будь-які небажані блокування, а потім виконати оновлення даних у одному сценарії / процесі.

Приклад із наведеного вище посилання дуже корисний:

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)

Я запустив це і, здавалося, працював, поки він не потрапив на мій поточний сеансID, і не видав помилку. Чи є спосіб перейти через користувачів та пропустити поточного користувача (якщо item.Name == 'DBO' та item.ID! = <Ідентифікатор сеансу поточного користувача>)? Я не можу знайти спосіб знайти ідентифікатор сеансу поточного користувача.
m.Walker

0

Я не дуже знайомий з postgresql, але я думаю, що ця публікація може привести вас у правильному напрямку:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.