避免使用ArcPy排他的架构锁定错误?


11

我有一个脚本,每晚都可以更新数据库中的某些功能(仅用于复制和替换某些功能)。此功能是“只读的”。我的问题是我无法避免用户打开了这些功能,并且我的脚本可能显示以下错误:

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

我可以通过某些命令强制phyton脚本复制文件,甚至由某些用户打开吗?我可以在运行脚本之前断开数据库上的所有连接吗?


1
这似乎是一个arcpy / arcgisscripting错误。请确认您使用的是哪个数据库。
blah238

Answers:


5

我想您正在使用SDE。

您应该使用sdemon命令行工具终止所有连接。

  1. 如果您在运行脚本的PC上安装了ArcSDE,则可以在sdemon -o kill本地执行以终止所有连接。看一下这个帮助主题。我不确定这会杀死10.0上的直接连接。我记得在9.3上这是一个问题,并且肯定在10.1上杀死了直接连接。
  2. 如果未安装ArcSDE,而ArcSDE仅在单独的服务器上运行,则可以从Python远程执行此命令。这个主题有一些讨论。

是的,我正在使用SDE(安装在服务器上)。但是“ sdemon -o kill”命令返回了语法错误。
avrechi'7

sdemon命令必须在ArcSDE中执行。我可以把它放在我的Python脚本上吗?
avrechi'7


2
命令sdemon -o kill是不够的。您应该传递其他参数,看看提供的链接
亚历克斯·马可夫

2

自从您说您正在使用SDE以来,另一种可能性是使用SQL,PL / SQL,T-SQL等从layer_lockstable_locks表中删除共享锁。例如:

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)

我运行了它,并且似乎可以正常工作,直到达到我当前的sessionID并抛出错误为止。有没有一种方法可以遍历用户并跳过当前用户(如果item.Name =='DBO'和item.ID!= <当前用户的会话ID>)?我找不到找到当前用户的会话ID的方法。
m.Walker '19

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.